1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_OBJECTS_H_ 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_OBJECTS_H_ 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/assert-scope.h" 10b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org#include "src/bailout-reason.h" 1121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org#include "src/base/bits.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/builtins.h" 135de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/checks.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/elements-kind.h" 15e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org#include "src/field-index.h" 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/flags.h" 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/list.h" 18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/property-details.h" 19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/smart-pointers.h" 20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/unicode-inl.h" 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone.h" 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 234b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#if V8_TARGET_ARCH_ARM 244b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm/constants-arm.h" // NOLINT 254b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#elif V8_TARGET_ARCH_ARM64 264b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm64/constants-arm64.h" // NOLINT 274b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#elif V8_TARGET_ARCH_MIPS 284b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/mips/constants-mips.h" // NOLINT 2912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#elif V8_TARGET_ARCH_MIPS64 3012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/mips64/constants-mips64.h" // NOLINT 314b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#endif 324b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org 33394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 35ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org// Most object types in the V8 JavaScript are described in this file. 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Inheritance hierarchy: 38a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Object 39a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Smi (immediate small integer) 40a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - HeapObject (superclass for everything allocated in the heap) 41a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSReceiver (suitable for property access) 42a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSObject 43a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSArray 44a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSArrayBuffer 45a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSArrayBufferView 46a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSTypedArray 47a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSDataView 4870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org// - JSCollection 4970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org// - JSSet 5070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org// - JSMap 51a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSSetIterator 52a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSMapIterator 53a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSWeakCollection 54a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSWeakMap 55a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSWeakSet 56a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSRegExp 57a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSFunction 58a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSGeneratorObject 59a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSModule 60a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - GlobalObject 61a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSGlobalObject 62a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSBuiltinsObject 63a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSGlobalProxy 64a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSValue 65a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSDate 66a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSMessageObject 67a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSProxy 68a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSFunctionProxy 69a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - FixedArrayBase 70a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ByteArray 71a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - FixedArray 72a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - DescriptorArray 73a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - HashTable 74a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Dictionary 75a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - StringTable 76a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - CompilationCacheTable 77a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - CodeCacheHashTable 78a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - MapCache 79a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - OrderedHashTable 80a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - OrderedHashSet 81a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - OrderedHashMap 82a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Context 83a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// - TypeFeedbackVector 84a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - JSFunctionResultCache 85a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ScopeInfo 86a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - TransitionArray 87a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - FixedDoubleArray 88a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalArray 89a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalUint8ClampedArray 90a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalInt8Array 91a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalUint8Array 92a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalInt16Array 93a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalUint16Array 94a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalInt32Array 95a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalUint32Array 96a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalFloat32Array 97a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Name 98a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - String 99a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SeqString 100a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SeqOneByteString 101a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SeqTwoByteString 102a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SlicedString 103a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ConsString 104a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalString 1052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// - ExternalOneByteString 106a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalTwoByteString 107a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - InternalizedString 108a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SeqInternalizedString 109a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SeqOneByteInternalizedString 110a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SeqTwoByteInternalizedString 111a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ConsInternalizedString 112a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalInternalizedString 1132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// - ExternalOneByteInternalizedString 114a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExternalTwoByteInternalizedString 115a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Symbol 116a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - HeapNumber 117a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Cell 118a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - PropertyCell 119a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Code 120a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Map 121a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Oddball 122a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Foreign 123a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SharedFunctionInfo 124a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Struct 125a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Box 126a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - DeclaredAccessorDescriptor 127a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - AccessorInfo 128a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - DeclaredAccessorInfo 129a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ExecutableAccessorInfo 130a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - AccessorPair 131a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - AccessCheckInfo 132a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - InterceptorInfo 133a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - CallHandlerInfo 134a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - TemplateInfo 135a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - FunctionTemplateInfo 136a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - ObjectTemplateInfo 137a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - Script 138a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - SignatureInfo 139a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - TypeSwitchInfo 140a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - DebugInfo 141a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - BreakPointInfo 142a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// - CodeCache 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Formats of Object*: 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Smi: [31 bit signed int] 0 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HeapObject: [32 bit direct pointer] (4 byte aligned) | 01 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 14971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass OStream; 1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 153750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgenum KeyedAccessStoreMode { 154750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STANDARD_STORE, 155750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_SMI_TO_OBJECT, 156750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_SMI_TO_DOUBLE, 157750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_DOUBLE_TO_OBJECT, 158750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_HOLEY_SMI_TO_OBJECT, 159750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE, 160750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT, 161750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_NO_TRANSITION, 162750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT, 163750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE, 164750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT, 165750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT, 166750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE, 167750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT, 168750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS, 169750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_NO_TRANSITION_HANDLE_COW 17065a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org}; 17165a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 172750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 173cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.orgenum ContextualMode { 174cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org NOT_CONTEXTUAL, 175cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org CONTEXTUAL 176cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org}; 177cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 178cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 17958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgenum MutableMode { 18058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org MUTABLE, 18158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org IMMUTABLE 18258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org}; 18358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org 18458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org 185750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic const int kGrowICDelta = STORE_AND_GROW_NO_TRANSITION - 186750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STANDARD_STORE; 187750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgSTATIC_ASSERT(STANDARD_STORE == 0); 188750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgSTATIC_ASSERT(kGrowICDelta == 189750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT - 190750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_SMI_TO_OBJECT); 191750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgSTATIC_ASSERT(kGrowICDelta == 192750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE - 193750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_SMI_TO_DOUBLE); 194750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgSTATIC_ASSERT(kGrowICDelta == 195750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT - 196750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org STORE_TRANSITION_DOUBLE_TO_OBJECT); 197750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 198750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 199750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic inline KeyedAccessStoreMode GetGrowStoreMode( 200750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org KeyedAccessStoreMode store_mode) { 201750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (store_mode < STORE_AND_GROW_NO_TRANSITION) { 202750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org store_mode = static_cast<KeyedAccessStoreMode>( 203750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static_cast<int>(store_mode) + kGrowICDelta); 204750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 205750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return store_mode; 206750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 207750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 208750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 209750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic inline bool IsTransitionStoreMode(KeyedAccessStoreMode store_mode) { 210750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return store_mode > STANDARD_STORE && 211750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org store_mode <= STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT && 212750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org store_mode != STORE_AND_GROW_NO_TRANSITION; 213750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 214750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 215750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 216750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic inline KeyedAccessStoreMode GetNonTransitioningStoreMode( 217750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org KeyedAccessStoreMode store_mode) { 218750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (store_mode >= STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { 219750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return store_mode; 220750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 221750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (store_mode >= STORE_AND_GROW_NO_TRANSITION) { 222750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return STORE_AND_GROW_NO_TRANSITION; 223750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 224750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return STANDARD_STORE; 225750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 226750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 227750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 228750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic inline bool IsGrowStoreMode(KeyedAccessStoreMode store_mode) { 229750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return store_mode >= STORE_AND_GROW_NO_TRANSITION && 230750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org store_mode <= STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; 231750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 232750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 233750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 2345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Setter that skips the write barrier if mode is SKIP_WRITE_BARRIER. 2355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgenum WriteBarrierMode { SKIP_WRITE_BARRIER, UPDATE_WRITE_BARRIER }; 2365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 2373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 2389259716434187c932704601f700375e53d865de8rossberg@chromium.org// Indicates whether a value can be loaded as a constant. 2399259716434187c932704601f700375e53d865de8rossberg@chromium.orgenum StoreMode { 2409259716434187c932704601f700375e53d865de8rossberg@chromium.org ALLOW_AS_CONSTANT, 2419259716434187c932704601f700375e53d865de8rossberg@chromium.org FORCE_FIELD 2429259716434187c932704601f700375e53d865de8rossberg@chromium.org}; 2439259716434187c932704601f700375e53d865de8rossberg@chromium.org 2449259716434187c932704601f700375e53d865de8rossberg@chromium.org 2453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// PropertyNormalizationMode is used to specify whether to keep 2463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// inobject properties when normalizing properties of a JSObject. 2473291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgenum PropertyNormalizationMode { 2483291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org CLEAR_INOBJECT_PROPERTIES, 2493291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org KEEP_INOBJECT_PROPERTIES 2503291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}; 2513291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 2523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 25331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org// Indicates how aggressively the prototype should be optimized. FAST_PROTOTYPE 25431c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org// will give the fastest result by tailoring the map to the prototype, but that 25531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org// will cause polymorphism with other objects. REGULAR_PROTOTYPE is to be used 25631c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org// (at least for now) when dynamically modifying the prototype chain of an 25731c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org// object using __proto__ or Object.setPrototypeOf. 25831c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.orgenum PrototypeOptimizationMode { REGULAR_PROTOTYPE, FAST_PROTOTYPE }; 2594a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 2604a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 261753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org// Indicates whether transitions can be added to a source map or not. 262753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.orgenum TransitionFlag { 263753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org INSERT_TRANSITION, 264753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org OMIT_TRANSITION 265753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org}; 266753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org 26733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2689768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.orgenum DebugExtraICState { 2699768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org DEBUG_BREAK, 2709768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org DEBUG_PREPARE_STEP_IN 2719768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org}; 2729768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org 2739768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org 27433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Indicates whether the transition is simple: the target map of the transition 27533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// either extends the current map with a new property, or it modifies the 27633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// property that was added last to the current map. 27733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgenum SimpleTransitionFlag { 27833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org SIMPLE_TRANSITION, 27933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org FULL_TRANSITION 28033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}; 28133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 28233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 28306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org// Indicates whether we are only interested in the descriptors of a particular 28406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org// map, or in all descriptors in the descriptor array. 28506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgenum DescriptorFlag { 28606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org ALL_DESCRIPTORS, 28706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org OWN_DESCRIPTORS 28806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org}; 28906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 290e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org// The GC maintains a bit of information, the MarkingParity, which toggles 291e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org// from odd to even and back every time marking is completed. Incremental 292e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org// marking can visit an object twice during a marking phase, so algorithms that 293e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org// that piggy-back on marking can use the parity to ensure that they only 294e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org// perform an operation on an object once per marking phase: they record the 295e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org// MarkingParity when they visit an object, and only re-visit the object when it 296e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org// is marked again and the MarkingParity changes. 297e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgenum MarkingParity { 298e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org NO_MARKING_PARITY, 299e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org ODD_MARKING_PARITY, 300e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org EVEN_MARKING_PARITY 301e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}; 30256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 303cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org// ICs store extra state in a Code object. The default extra state is 304cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org// kNoExtraICState. 305cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.orgtypedef int ExtraICState; 306cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.orgstatic const ExtraICState kNoExtraICState = 0; 307cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 308145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com// Instance size sentinel for objects of variable size. 3091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kVariableSizeSentinel = 0; 310145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com 3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// We may store the unsigned bit field as signed Smi value and do not 3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// use the sign bit. 313113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.orgconst int kStubMajorKeyBits = 7; 3147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgconst int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1; 315145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com 31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All Maps have a field instance_type containing a InstanceType. 31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// It describes the type of the instances. 31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// As an example, a JavaScript object is a heap object and its map 32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// instance_type is JS_OBJECT_TYPE. 32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The names of the string instance types are intended to systematically 3230c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org// mirror their encoding in the instance_type field of the map. The default 3242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// encoding is considered TWO_BYTE. It is not mentioned in the name. ONE_BYTE 3250c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org// encoding is mentioned explicitly in the name. Likewise, the default 3260c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org// representation is considered sequential. It is not mentioned in the 3272efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// name. The other representations (e.g. CONS, EXTERNAL) are explicitly 3284a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// mentioned. Finally, the string is either a STRING_TYPE (if it is a normal 3294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// string) or a INTERNALIZED_STRING_TYPE (if it is a internalized string). 33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// NOTE: The following things are some that depend on the string types having 33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// instance_types that are less than those of all other types: 33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HeapObject::Size, HeapObject::IterateBody, the typeof operator, and 33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Object::IsString. 33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 336c27e4e79503d86932450a812ce8fd6ee6d9a5bdcager@chromium.org// NOTE: Everything following JS_VALUE_TYPE is considered a 33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// JSObject for GC purposes. The first four entries here have typeof 33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 'object', whereas JS_FUNCTION_TYPE has typeof 'function'. 3392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org#define INSTANCE_TYPE_LIST(V) \ 3402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(STRING_TYPE) \ 3412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ONE_BYTE_STRING_TYPE) \ 3422c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CONS_STRING_TYPE) \ 3432c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CONS_ONE_BYTE_STRING_TYPE) \ 3442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SLICED_STRING_TYPE) \ 3452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SLICED_ONE_BYTE_STRING_TYPE) \ 3462c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_STRING_TYPE) \ 3472c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_ONE_BYTE_STRING_TYPE) \ 3482c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 3492c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_STRING_TYPE) \ 3502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE) \ 3512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 3522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 3532c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(INTERNALIZED_STRING_TYPE) \ 3542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 3552c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_INTERNALIZED_STRING_TYPE) \ 3562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 3572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 3582c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE) \ 3592c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 3602c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 3612c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 3622c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SYMBOL_TYPE) \ 3632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 3642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(MAP_TYPE) \ 3652c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CODE_TYPE) \ 3662c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ODDBALL_TYPE) \ 3672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CELL_TYPE) \ 3682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(PROPERTY_CELL_TYPE) \ 3692c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 3702c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(HEAP_NUMBER_TYPE) \ 3712c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(MUTABLE_HEAP_NUMBER_TYPE) \ 3722c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FOREIGN_TYPE) \ 3732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(BYTE_ARRAY_TYPE) \ 3742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FREE_SPACE_TYPE) \ 3752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org /* Note: the order of these external array */ \ 3762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org /* types is relied upon in */ \ 3772c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org /* Object::IsExternalArray(). */ \ 3782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_INT8_ARRAY_TYPE) \ 3792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_UINT8_ARRAY_TYPE) \ 3802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_INT16_ARRAY_TYPE) \ 3812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_UINT16_ARRAY_TYPE) \ 3822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_INT32_ARRAY_TYPE) \ 3832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_UINT32_ARRAY_TYPE) \ 3842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_FLOAT32_ARRAY_TYPE) \ 3852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_FLOAT64_ARRAY_TYPE) \ 3862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_UINT8_CLAMPED_ARRAY_TYPE) \ 3872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 3882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_INT8_ARRAY_TYPE) \ 3892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_UINT8_ARRAY_TYPE) \ 3902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_INT16_ARRAY_TYPE) \ 3912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_UINT16_ARRAY_TYPE) \ 3922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_INT32_ARRAY_TYPE) \ 3932c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_UINT32_ARRAY_TYPE) \ 3942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_FLOAT32_ARRAY_TYPE) \ 3952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_FLOAT64_ARRAY_TYPE) \ 3962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_UINT8_CLAMPED_ARRAY_TYPE) \ 3972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 3982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FILLER_TYPE) \ 3992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 4002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(DECLARED_ACCESSOR_DESCRIPTOR_TYPE) \ 4012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(DECLARED_ACCESSOR_INFO_TYPE) \ 4022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXECUTABLE_ACCESSOR_INFO_TYPE) \ 4032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ACCESSOR_PAIR_TYPE) \ 4042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ACCESS_CHECK_INFO_TYPE) \ 4052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(INTERCEPTOR_INFO_TYPE) \ 4062c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CALL_HANDLER_INFO_TYPE) \ 4072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FUNCTION_TEMPLATE_INFO_TYPE) \ 4082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(OBJECT_TEMPLATE_INFO_TYPE) \ 4092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SIGNATURE_INFO_TYPE) \ 4102c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(TYPE_SWITCH_INFO_TYPE) \ 4112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ALLOCATION_MEMENTO_TYPE) \ 4122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ALLOCATION_SITE_TYPE) \ 4132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SCRIPT_TYPE) \ 4142c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CODE_CACHE_TYPE) \ 4152c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(POLYMORPHIC_CODE_CACHE_TYPE) \ 4162c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(TYPE_FEEDBACK_INFO_TYPE) \ 4172c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ALIASED_ARGUMENTS_ENTRY_TYPE) \ 4182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(BOX_TYPE) \ 4192c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 4202c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_ARRAY_TYPE) \ 4212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FIXED_DOUBLE_ARRAY_TYPE) \ 4222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CONSTANT_POOL_ARRAY_TYPE) \ 4232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHARED_FUNCTION_INFO_TYPE) \ 4242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 4252c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_MESSAGE_OBJECT_TYPE) \ 4262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 4272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_VALUE_TYPE) \ 4282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_DATE_TYPE) \ 4292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_OBJECT_TYPE) \ 4302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_CONTEXT_EXTENSION_OBJECT_TYPE) \ 4312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_GENERATOR_OBJECT_TYPE) \ 4322c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_MODULE_TYPE) \ 4332c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_GLOBAL_OBJECT_TYPE) \ 4342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_BUILTINS_OBJECT_TYPE) \ 4352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_GLOBAL_PROXY_TYPE) \ 4362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_ARRAY_TYPE) \ 4372c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_ARRAY_BUFFER_TYPE) \ 4382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_TYPED_ARRAY_TYPE) \ 4392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_DATA_VIEW_TYPE) \ 4402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_PROXY_TYPE) \ 4412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_SET_TYPE) \ 4422c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_MAP_TYPE) \ 4432c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_SET_ITERATOR_TYPE) \ 4442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_MAP_ITERATOR_TYPE) \ 4452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_WEAK_MAP_TYPE) \ 4462c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_WEAK_SET_TYPE) \ 4472c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_REGEXP_TYPE) \ 4482c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 4492c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_FUNCTION_TYPE) \ 4502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JS_FUNCTION_PROXY_TYPE) \ 4512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(DEBUG_INFO_TYPE) \ 452c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org V(BREAK_POINT_INFO_TYPE) 45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Since string types are not consecutive, this macro is used to 45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// iterate over them. 4572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org#define STRING_TYPE_LIST(V) \ 4582c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(STRING_TYPE, kVariableSizeSentinel, string, String) \ 4592c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ONE_BYTE_STRING_TYPE, kVariableSizeSentinel, one_byte_string, \ 4602c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org OneByteString) \ 4612c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CONS_STRING_TYPE, ConsString::kSize, cons_string, ConsString) \ 4622c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CONS_ONE_BYTE_STRING_TYPE, ConsString::kSize, cons_one_byte_string, \ 4632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ConsOneByteString) \ 4642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SLICED_STRING_TYPE, SlicedString::kSize, sliced_string, SlicedString) \ 4652c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SLICED_ONE_BYTE_STRING_TYPE, SlicedString::kSize, sliced_one_byte_string, \ 4662c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org SlicedOneByteString) \ 4672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_STRING_TYPE, ExternalTwoByteString::kSize, external_string, \ 4682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ExternalString) \ 4692c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kSize, \ 4702c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org external_one_byte_string, ExternalOneByteString) \ 4712c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE, ExternalTwoByteString::kSize, \ 4722c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org external_string_with_one_byte_data, ExternalStringWithOneByteData) \ 4732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_STRING_TYPE, ExternalTwoByteString::kShortSize, \ 4742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org short_external_string, ShortExternalString) \ 4752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kShortSize, \ 4762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org short_external_one_byte_string, ShortExternalOneByteString) \ 4772c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 4782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ExternalTwoByteString::kShortSize, \ 4792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org short_external_string_with_one_byte_data, \ 4802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ShortExternalStringWithOneByteData) \ 4812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 4822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(INTERNALIZED_STRING_TYPE, kVariableSizeSentinel, internalized_string, \ 4832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org InternalizedString) \ 4842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ONE_BYTE_INTERNALIZED_STRING_TYPE, kVariableSizeSentinel, \ 4852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org one_byte_internalized_string, OneByteInternalizedString) \ 4862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_INTERNALIZED_STRING_TYPE, ExternalTwoByteString::kSize, \ 4872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org external_internalized_string, ExternalInternalizedString) \ 4882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, ExternalOneByteString::kSize, \ 4892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org external_one_byte_internalized_string, ExternalOneByteInternalizedString) \ 4902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 4912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ExternalTwoByteString::kSize, \ 4922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org external_internalized_string_with_one_byte_data, \ 4932c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ExternalInternalizedStringWithOneByteData) \ 4942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE, \ 4952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ExternalTwoByteString::kShortSize, short_external_internalized_string, \ 4962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ShortExternalInternalizedString) \ 4972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, \ 4982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ExternalOneByteString::kShortSize, \ 4992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org short_external_one_byte_internalized_string, \ 5002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ShortExternalOneByteInternalizedString) \ 5012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 5022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ExternalTwoByteString::kShortSize, \ 5032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org short_external_internalized_string_with_one_byte_data, \ 5042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ShortExternalInternalizedStringWithOneByteData) 50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A struct is a simple object a set of object-valued fields. Including an 50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// object type in this causes the compiler to generate most of the boilerplate 50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// code for the class including allocation and garbage collection routines, 50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// casts and predicates. All you need to define is the class, methods and 51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// object verification routines. Easy, no? 51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Note that for subtle reasons related to the ordering or numerical values of 51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST 51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// manually. 515865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#define STRUCT_LIST(V) \ 5161fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org V(BOX, Box, box) \ 5177c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org V(DECLARED_ACCESSOR_DESCRIPTOR, \ 5187c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DeclaredAccessorDescriptor, \ 5197c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org declared_accessor_descriptor) \ 5207c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org V(DECLARED_ACCESSOR_INFO, DeclaredAccessorInfo, declared_accessor_info) \ 5217c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org V(EXECUTABLE_ACCESSOR_INFO, ExecutableAccessorInfo, executable_accessor_info)\ 522f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \ 523ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ 524ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ 525ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ 526ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ 527ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ 528ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(SIGNATURE_INFO, SignatureInfo, signature_info) \ 529ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \ 530ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org V(SCRIPT, Script, script) \ 531bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org V(ALLOCATION_SITE, AllocationSite, allocation_site) \ 532ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento) \ 533e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org V(CODE_CACHE, CodeCache, code_cache) \ 534f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org V(POLYMORPHIC_CODE_CACHE, PolymorphicCodeCache, polymorphic_code_cache) \ 535ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info) \ 536865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \ 537ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(DEBUG_INFO, DebugInfo, debug_info) \ 53865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) 53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// We use the full 8 bits of the instance_type field to encode heap object 54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// instance types. The high-order bit (bit 7) is set if the object is not a 54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// string, and cleared if it is a string. 54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst uint32_t kIsNotStringMask = 0x80; 54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst uint32_t kStringTag = 0x0; 54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst uint32_t kNotStringTag = 0x80; 54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// Bit 6 indicates that the object is an internalized string (if set) or not. 5481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Bit 7 has to be clear as well. 549ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgconst uint32_t kIsNotInternalizedMask = 0x40; 550ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgconst uint32_t kNotInternalizedTag = 0x40; 551ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgconst uint32_t kInternalizedTag = 0x0; 5529fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org 5539fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org// If bit 7 is clear then bit 2 indicates whether the string consists of 5549fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org// two-byte characters or one-byte characters. 5559fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.orgconst uint32_t kStringEncodingMask = 0x4; 55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst uint32_t kTwoByteStringTag = 0x0; 557e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgconst uint32_t kOneByteStringTag = 0x4; 55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5599fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org// If bit 7 is clear, the low-order 2 bits indicate the representation 56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// of the string. 5619fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.orgconst uint32_t kStringRepresentationMask = 0x03; 56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum StringRepresentationTag { 56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kSeqStringTag = 0x0, 56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kConsStringTag = 0x1, 5654668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org kExternalStringTag = 0x2, 5664668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org kSlicedStringTag = 0x3 56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 5684668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgconst uint32_t kIsIndirectStringMask = 0x1; 5694668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgconst uint32_t kIsIndirectStringTag = 0x1; 570196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgSTATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0); // NOLINT 571196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgSTATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0); // NOLINT 572196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgSTATIC_ASSERT((kConsStringTag & 573196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 574196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgSTATIC_ASSERT((kSlicedStringTag & 575196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 57780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// Use this mask to distinguish between cons and slice only after making 57880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// sure that the string is one of the two (an indirect string). 57980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgconst uint32_t kSlicedNotConsMask = kSlicedStringTag & ~kConsStringTag; 580ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgSTATIC_ASSERT(IS_POWER_OF_TWO(kSlicedNotConsMask)); 58180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org 5825ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org// If bit 7 is clear, then bit 3 indicates whether this two-byte 583ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// string actually contains one byte data. 584ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgconst uint32_t kOneByteDataHintMask = 0x08; 585ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgconst uint32_t kOneByteDataHintTag = 0x08; 5865ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 5871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org// If bit 7 is clear and string representation indicates an external string, 5881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org// then bit 4 indicates whether the data pointer is cached. 5891b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst uint32_t kShortExternalStringMask = 0x10; 5901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst uint32_t kShortExternalStringTag = 0x10; 5911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 592d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 593d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org// A ConsString with an empty string as the right side is a candidate 594d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org// for being shortcut by the garbage collector. We don't allocate any 595d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org// non-flat internalized strings, so we do not shortcut them thereby 596d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org// avoiding turning internalized strings into strings. The bit-masks 597d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org// below contain the internalized bit as additional safety. 598d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org// See heap.cc, mark-compact.cc and objects-visiting.cc. 599d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgconst uint32_t kShortcutTypeMask = 600d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org kIsNotStringMask | 601ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org kIsNotInternalizedMask | 602d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org kStringRepresentationMask; 603ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgconst uint32_t kShortcutTypeTag = kConsStringTag | kNotInternalizedTag; 604d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 605d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgstatic inline bool IsShortcutCandidate(int type) { 606d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return ((type & kShortcutTypeMask) == kShortcutTypeTag); 607d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org} 608d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org 609d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum InstanceType { 6110c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // String types. 6122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org INTERNALIZED_STRING_TYPE = 6132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kTwoByteStringTag | kSeqStringTag | kInternalizedTag, 6142c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ONE_BYTE_INTERNALIZED_STRING_TYPE = 6152c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kOneByteStringTag | kSeqStringTag | kInternalizedTag, 6162c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_INTERNALIZED_STRING_TYPE = 6172c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kTwoByteStringTag | kExternalStringTag | kInternalizedTag, 6182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE = 6192c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kOneByteStringTag | kExternalStringTag | kInternalizedTag, 620ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE = 6212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_INTERNALIZED_STRING_TYPE | kOneByteDataHintTag | 6222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kInternalizedTag, 6232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE = EXTERNAL_INTERNALIZED_STRING_TYPE | 6242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kShortExternalStringTag | 6252c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kInternalizedTag, 6262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE = 6272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kShortExternalStringTag | 6282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kInternalizedTag, 629ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE = 6302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 6312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kShortExternalStringTag | kInternalizedTag, 632ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org STRING_TYPE = INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 6332c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ONE_BYTE_STRING_TYPE = 6342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 635ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag | kNotInternalizedTag, 6362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org CONS_ONE_BYTE_STRING_TYPE = 637ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org kOneByteStringTag | kConsStringTag | kNotInternalizedTag, 638ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org SLICED_STRING_TYPE = 639ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org kTwoByteStringTag | kSlicedStringTag | kNotInternalizedTag, 6402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org SLICED_ONE_BYTE_STRING_TYPE = 641ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org kOneByteStringTag | kSlicedStringTag | kNotInternalizedTag, 642ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org EXTERNAL_STRING_TYPE = 6432c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 6442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_ONE_BYTE_STRING_TYPE = 6452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 646ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 6472c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 6482c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kNotInternalizedTag, 649ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org SHORT_EXTERNAL_STRING_TYPE = 650ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 6512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE = 6522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 653ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 6542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 6552c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kNotInternalizedTag, 6564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 6574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Non-string names 6580cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org SYMBOL_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE 65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6600c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Objects allocated in their own spaces (never in new space). 6614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MAP_TYPE, 66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CODE_TYPE, 66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ODDBALL_TYPE, 66441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org CELL_TYPE, 66541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org PROPERTY_CELL_TYPE, 6660c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 6670c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // "Data", objects that cannot contain non-map-word pointers to heap 6680c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // objects. 6690c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org HEAP_NUMBER_TYPE, 67058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org MUTABLE_HEAP_NUMBER_TYPE, 671ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org FOREIGN_TYPE, 67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen BYTE_ARRAY_TYPE, 673c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FREE_SPACE_TYPE, 674af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_INT8_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE 675af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_UINT8_ARRAY_TYPE, 676af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_INT16_ARRAY_TYPE, 677af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_UINT16_ARRAY_TYPE, 678af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_INT32_ARRAY_TYPE, 679af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_UINT32_ARRAY_TYPE, 680af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_FLOAT32_ARRAY_TYPE, 681af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_FLOAT64_ARRAY_TYPE, 682af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org EXTERNAL_UINT8_CLAMPED_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE 6832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org FIXED_INT8_ARRAY_TYPE, // FIRST_FIXED_TYPED_ARRAY_TYPE 6845c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_UINT8_ARRAY_TYPE, 6855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_INT16_ARRAY_TYPE, 6865c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_UINT16_ARRAY_TYPE, 6875c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_INT32_ARRAY_TYPE, 6885c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_UINT32_ARRAY_TYPE, 6895c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_FLOAT32_ARRAY_TYPE, 6905c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_FLOAT64_ARRAY_TYPE, 6915c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIXED_UINT8_CLAMPED_ARRAY_TYPE, // LAST_FIXED_TYPED_ARRAY_TYPE 6926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org FIXED_DOUBLE_ARRAY_TYPE, 6930c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org FILLER_TYPE, // LAST_DATA_TYPE 69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6950c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Structs. 6967c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARED_ACCESSOR_DESCRIPTOR_TYPE, 6977c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARED_ACCESSOR_INFO_TYPE, 6987c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org EXECUTABLE_ACCESSOR_INFO_TYPE, 699f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com ACCESSOR_PAIR_TYPE, 70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ACCESS_CHECK_INFO_TYPE, 70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INTERCEPTOR_INFO_TYPE, 70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CALL_HANDLER_INFO_TYPE, 70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FUNCTION_TEMPLATE_INFO_TYPE, 70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen OBJECT_TEMPLATE_INFO_TYPE, 70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SIGNATURE_INFO_TYPE, 70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TYPE_SWITCH_INFO_TYPE, 707bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org ALLOCATION_SITE_TYPE, 708ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org ALLOCATION_MEMENTO_TYPE, 7090c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org SCRIPT_TYPE, 710ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org CODE_CACHE_TYPE, 711e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org POLYMORPHIC_CODE_CACHE_TYPE, 712f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org TYPE_FEEDBACK_INFO_TYPE, 713ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ALIASED_ARGUMENTS_ENTRY_TYPE, 714c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org BOX_TYPE, 71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DEBUG_INFO_TYPE, 71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen BREAK_POINT_INFO_TYPE, 7170c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org FIXED_ARRAY_TYPE, 71870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CONSTANT_POOL_ARRAY_TYPE, 7190c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org SHARED_FUNCTION_INFO_TYPE, 7200c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 721c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // All the following types are subtypes of JSReceiver, which corresponds to 722c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // objects in the JS sense. The first and the last type in this range are 723c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // the two forms of function. This organization enables using the same 724c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // compares for checking the JS_RECEIVER/SPEC_OBJECT range and the 725c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // NONCALLABLE_JS_OBJECT range. 726c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com JS_FUNCTION_PROXY_TYPE, // FIRST_JS_RECEIVER_TYPE, FIRST_JS_PROXY_TYPE 7272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org JS_PROXY_TYPE, // LAST_JS_PROXY_TYPE 7282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org JS_VALUE_TYPE, // FIRST_JS_OBJECT_TYPE 7293484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org JS_MESSAGE_OBJECT_TYPE, 7304efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org JS_DATE_TYPE, 73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen JS_OBJECT_TYPE, 7323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org JS_CONTEXT_EXTENSION_OBJECT_TYPE, 733e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org JS_GENERATOR_OBJECT_TYPE, 734ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com JS_MODULE_TYPE, 73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen JS_GLOBAL_OBJECT_TYPE, 73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen JS_BUILTINS_OBJECT_TYPE, 7375a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org JS_GLOBAL_PROXY_TYPE, 73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen JS_ARRAY_TYPE, 739f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org JS_ARRAY_BUFFER_TYPE, 740e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org JS_TYPED_ARRAY_TYPE, 7411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org JS_DATA_VIEW_TYPE, 742394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com JS_SET_TYPE, 743394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com JS_MAP_TYPE, 7444ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org JS_SET_ITERATOR_TYPE, 7454ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org JS_MAP_ITERATOR_TYPE, 7467c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org JS_WEAK_MAP_TYPE, 747ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org JS_WEAK_SET_TYPE, 748c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com JS_REGEXP_TYPE, 749c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE 75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Pseudo-types 75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FIRST_TYPE = 0x0, 753c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LAST_TYPE = JS_FUNCTION_TYPE, 7544a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org FIRST_NAME_TYPE = FIRST_TYPE, 7554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org LAST_NAME_TYPE = SYMBOL_TYPE, 7564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE, 7574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE, 7584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org FIRST_NONSTRING_TYPE = SYMBOL_TYPE, 7590c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Boundaries for testing for an external array. 760af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org FIRST_EXTERNAL_ARRAY_TYPE = EXTERNAL_INT8_ARRAY_TYPE, 761af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org LAST_EXTERNAL_ARRAY_TYPE = EXTERNAL_UINT8_CLAMPED_ARRAY_TYPE, 7625c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // Boundaries for testing for a fixed typed array. 7635c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE, 7645c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_UINT8_CLAMPED_ARRAY_TYPE, 7650c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Boundary for promotion to old data space/old pointer space. 7660c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org LAST_DATA_TYPE = FILLER_TYPE, 767d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy). 768d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Note that there is no range for JSObject or JSProxy, since their subtypes 769d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // are not continuous in this enum! The enum ranges instead reflect the 770d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // external class names, where proxies are treated as either ordinary objects, 771d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // or functions. 772c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FIRST_JS_RECEIVER_TYPE = JS_FUNCTION_PROXY_TYPE, 773d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org LAST_JS_RECEIVER_TYPE = LAST_TYPE, 774c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Boundaries for testing the types represented as JSObject 775c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FIRST_JS_OBJECT_TYPE = JS_VALUE_TYPE, 776c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LAST_JS_OBJECT_TYPE = LAST_TYPE, 777c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Boundaries for testing the types represented as JSProxy 778c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FIRST_JS_PROXY_TYPE = JS_FUNCTION_PROXY_TYPE, 779c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LAST_JS_PROXY_TYPE = JS_PROXY_TYPE, 780c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Boundaries for testing whether the type is a JavaScript object. 781c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FIRST_SPEC_OBJECT_TYPE = FIRST_JS_RECEIVER_TYPE, 782c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LAST_SPEC_OBJECT_TYPE = LAST_JS_RECEIVER_TYPE, 783d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Boundaries for testing the types for which typeof is "object". 784c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FIRST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_PROXY_TYPE, 785d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org LAST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_REGEXP_TYPE, 786c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Note that the types for which typeof is "function" are not continuous. 787c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Define this so that we can put assertions on discrete checks. 788c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NUM_OF_CALLABLE_SPEC_OBJECT_TYPES = 2 78943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kExternalArrayTypeCount = 7921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org LAST_EXTERNAL_ARRAY_TYPE - FIRST_EXTERNAL_ARRAY_TYPE + 1; 79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 794d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT(JS_OBJECT_TYPE == Internals::kJSObjectType); 795d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT(FIRST_NONSTRING_TYPE == Internals::kFirstNonstringType); 796d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT(ODDBALL_TYPE == Internals::kOddballType); 797d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT(FOREIGN_TYPE == Internals::kForeignType); 7985ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 7995ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 800304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#define FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(V) \ 801304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(FAST_ELEMENTS_SUB_TYPE) \ 802304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(DICTIONARY_ELEMENTS_SUB_TYPE) \ 803304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(FAST_PROPERTIES_SUB_TYPE) \ 804304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(DICTIONARY_PROPERTIES_SUB_TYPE) \ 805304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(MAP_CODE_CACHE_SUB_TYPE) \ 806304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(SCOPE_INFO_SUB_TYPE) \ 8074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(STRING_TABLE_SUB_TYPE) \ 808304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(DESCRIPTOR_ARRAY_SUB_TYPE) \ 809304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org V(TRANSITION_ARRAY_SUB_TYPE) 810304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 811304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgenum FixedArraySubInstanceType { 812304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#define DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE(name) name, 813304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE) 814304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE 815304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org LAST_FIXED_ARRAY_SUB_TYPE = TRANSITION_ARRAY_SUB_TYPE 816304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}; 817304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 818304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum CompareResult { 82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen LESS = -1, 82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EQUAL = 0, 82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GREATER = 1, 82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NOT_EQUAL = GREATER 82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 82643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DECL_BOOLEAN_ACCESSORS(name) \ 8294b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline bool name() const; \ 83043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_##name(bool value); \ 83143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#define DECL_ACCESSORS(name, type) \ 8344b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline type* name() const; \ 8353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org inline void set_##name(type* value, \ 8365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org WriteBarrierMode mode = UPDATE_WRITE_BARRIER); \ 83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 838975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 839975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#define DECLARE_CAST(type) \ 840975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org INLINE(static type* cast(Object* object)); \ 841975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org INLINE(static const type* cast(const Object* object)); 842975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 843975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 844830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgclass AccessorPair; 845b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgclass AllocationSite; 84637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgclass AllocationSiteCreationContext; 84737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgclass AllocationSiteUsageContext; 8484acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgclass DictionaryElementsAccessor; 8497c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgclass ElementsAccessor; 8504acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgclass FixedArrayBase; 851113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.orgclass GlobalObject; 85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ObjectVisitor; 8538ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.orgclass LookupIterator; 8544acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgclass StringStream; 855a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgclass TypeFeedbackVector; 8566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org// We cannot just say "class HeapType;" if it is created from a template... =8-? 857034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgtemplate<class> class TypeImpl; 858034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgstruct HeapTypeConfig; 8596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef TypeImpl<HeapTypeConfig> HeapType; 86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A template-ized version of the IsXXX functions. 8634e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgtemplate <class C> inline bool Is(Object* obj); 86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 865c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 866c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#define DECLARE_VERIFIER(Name) void Name##Verify(); 867c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#else 868c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#define DECLARE_VERIFIER(Name) 869c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 870a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 871a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#ifdef OBJECT_PRINT 872f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org#define DECLARE_PRINTER(Name) void Name##Print(OStream& os); // NOLINT 873a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#else 874a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#define DECLARE_PRINTER(Name) 875a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#endif 876a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 8770511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 8782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org#define OBJECT_TYPE_LIST(V) \ 8792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Smi) \ 8802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(HeapObject) \ 8812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Number) 8822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 8832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org#define HEAP_OBJECT_TYPE_LIST(V) \ 8842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(HeapNumber) \ 8852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(MutableHeapNumber) \ 8862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Name) \ 8872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(UniqueName) \ 8882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(String) \ 8892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SeqString) \ 8902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalString) \ 8912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ConsString) \ 8922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SlicedString) \ 8932c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalTwoByteString) \ 8942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalOneByteString) \ 8952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SeqTwoByteString) \ 8962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SeqOneByteString) \ 8972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(InternalizedString) \ 8982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Symbol) \ 8992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org \ 9002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalArray) \ 9012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalInt8Array) \ 9022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalUint8Array) \ 9032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalInt16Array) \ 9042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalUint16Array) \ 9052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalInt32Array) \ 9062c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalUint32Array) \ 9072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalFloat32Array) \ 9082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalFloat64Array) \ 9092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ExternalUint8ClampedArray) \ 9102c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedTypedArrayBase) \ 9112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedUint8Array) \ 9122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedInt8Array) \ 9132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedUint16Array) \ 9142c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedInt16Array) \ 9152c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedUint32Array) \ 9162c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedInt32Array) \ 9172c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedFloat32Array) \ 9182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedFloat64Array) \ 9192c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedUint8ClampedArray) \ 9202c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ByteArray) \ 9212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FreeSpace) \ 9222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSReceiver) \ 9232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSObject) \ 9242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSContextExtensionObject) \ 9252c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSGeneratorObject) \ 9262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSModule) \ 9272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Map) \ 9282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(DescriptorArray) \ 9292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(TransitionArray) \ 930a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(TypeFeedbackVector) \ 9312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(DeoptimizationInputData) \ 9322c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(DeoptimizationOutputData) \ 9332c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(DependentCode) \ 9342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedArray) \ 9352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(FixedDoubleArray) \ 9362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ConstantPoolArray) \ 9372c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Context) \ 9382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(NativeContext) \ 9392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ScopeInfo) \ 9402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSFunction) \ 9412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Code) \ 9422c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Oddball) \ 9432c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(SharedFunctionInfo) \ 9442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSValue) \ 9452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSDate) \ 9462c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSMessageObject) \ 9472c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(StringWrapper) \ 9482c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Foreign) \ 9492c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Boolean) \ 9502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSArray) \ 9512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSArrayBuffer) \ 9522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSArrayBufferView) \ 9532c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSTypedArray) \ 9542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSDataView) \ 9552c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSProxy) \ 9562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSFunctionProxy) \ 9572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSSet) \ 9582c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSMap) \ 9592c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSSetIterator) \ 9602c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSMapIterator) \ 9612c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSWeakCollection) \ 9622c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSWeakMap) \ 9632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSWeakSet) \ 9642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSRegExp) \ 9652c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(HashTable) \ 9662c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Dictionary) \ 9672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(StringTable) \ 9682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSFunctionResultCache) \ 9692c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(NormalizedMapCache) \ 9702c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CompilationCacheTable) \ 9712c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(CodeCacheHashTable) \ 9722c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(PolymorphicCodeCacheHashTable) \ 9732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(MapCache) \ 9742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Primitive) \ 9752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(GlobalObject) \ 9762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSGlobalObject) \ 9772c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSBuiltinsObject) \ 9782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(JSGlobalProxy) \ 9792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(UndetectableObject) \ 9802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(AccessCheckNeeded) \ 9812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(Cell) \ 9822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(PropertyCell) \ 9832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(ObjectHashTable) \ 9842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org V(WeakHashTable) \ 9859e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org V(OrderedHashTable) 986594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 98743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Object is the abstract superclass for all classes in the 98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// object hierarchy. 98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Object does not use any virtual functions to avoid the 99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// allocation of the C++ vtable. 991a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// Since both Smi and HeapObject are subclasses of Object no 99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// data members can be present in Object. 993a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgclass Object { 99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Type testing. 99608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org bool IsObject() const { return true; } 997bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 99808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#define IS_TYPE_FUNCTION_DECL(type_) INLINE(bool Is##type_() const); 9990511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 10000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 10010511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com#undef IS_TYPE_FUNCTION_DECL 100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1003474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // A non-keyed store is of the form a.x = foo or a["x"] = foo whereas 1004474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // a keyed store is of the form a[expression] = foo. 1005474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org enum StoreFromKeyed { 1006474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org MAY_BE_STORE_FROM_KEYED, 1007474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org CERTAINLY_NOT_STORE_FROM_KEYED 1008474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org }; 1009474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 101008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsFixedArrayBase() const); 101108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsExternal() const); 101208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsAccessorInfo() const); 1013394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 101408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsStruct() const); 101508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \ 101608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool Is##Name() const); 101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STRUCT_LIST(DECLARE_STRUCT_PREDICATE) 101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DECLARE_STRUCT_PREDICATE 101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsSpecObject()) const; 102108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsSpecFunction()) const; 102208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsTemplateInfo()) const; 102308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsNameDictionary() const); 102408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsSeededNumberDictionary() const); 102508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsUnseededNumberDictionary() const); 102608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsOrderedHashSet() const); 102708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsOrderedHashMap() const); 102808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org bool IsCallable() const; 10299fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org 103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Oddball testing. 103108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsUndefined() const); 103208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsNull() const); 103308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsTheHole() const); 103408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsException() const); 103508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsUninitialized() const); 103608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsTrue() const); 103708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsFalse() const); 103808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsArgumentsMarker() const); 1039c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1040c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Filler objects (fillers and free space objects). 104108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsFiller() const); 104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Extract the number. 104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline double Number(); 104508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org INLINE(bool IsNaN() const); 10467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org INLINE(bool IsMinusZero() const); 1047d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org bool ToInt32(int32_t* value); 1048d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org bool ToUint32(uint32_t* value); 104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1050f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org inline Representation OptimalRepresentation() { 10511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org if (!FLAG_track_fields) return Representation::Tagged(); 10521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org if (IsSmi()) { 1053f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return Representation::Smi(); 1054f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } else if (FLAG_track_double_fields && IsHeapNumber()) { 1055f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return Representation::Double(); 10561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } else if (FLAG_track_computed_fields && IsUninitialized()) { 10571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return Representation::None(); 10581fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } else if (FLAG_track_heap_object_fields) { 1059e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsHeapObject()); 1060906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org return Representation::HeapObject(); 1061f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } else { 1062f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return Representation::Tagged(); 1063f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } 1064f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } 1065f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 1066f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org inline bool FitsRepresentation(Representation representation) { 10671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org if (FLAG_track_fields && representation.IsNone()) { 10681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return false; 10691fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } else if (FLAG_track_fields && representation.IsSmi()) { 1070f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return IsSmi(); 1071f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } else if (FLAG_track_double_fields && representation.IsDouble()) { 107258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org return IsMutableHeapNumber() || IsNumber(); 1073906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org } else if (FLAG_track_heap_object_fields && representation.IsHeapObject()) { 1074906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org return IsHeapObject(); 1075f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } 1076f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return true; 1077f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } 1078f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 1079e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Handle<HeapType> OptimalType(Isolate* isolate, Representation representation); 1080e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org 1081e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org inline static Handle<Object> NewStorageFor(Isolate* isolate, 1082e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Handle<Object> object, 1083e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Representation representation); 108457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 108558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org inline static Handle<Object> WrapForRead(Isolate* isolate, 108658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org Handle<Object> object, 108758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org Representation representation); 108858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org 10896d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Returns true if the object is of the correct type to be used as a 10906d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // implementation of a JSObject's elements. 10916d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org inline bool HasValidElements(); 10926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 10935a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org inline bool HasSpecificClassOf(String* name); 10945a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 10953d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org bool BooleanValue(); // ECMA-262 9.2. 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Convert to a JSObject if needed. 109846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // native_context is used when creating wrapper object. 109974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org static inline MaybeHandle<JSReceiver> ToObject(Isolate* isolate, 110074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org Handle<Object> object); 110174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org static MaybeHandle<JSReceiver> ToObject(Isolate* isolate, 110274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org Handle<Object> object, 110374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org Handle<Context> context); 110443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Converts this to a Smi if possible. 11063484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org static MUST_USE_RESULT inline MaybeHandle<Smi> ToSmi(Isolate* isolate, 11073484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<Object> object); 110843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11098ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetProperty(LookupIterator* it); 111051e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org 111151e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org // Implementation of [[Put]], ECMA-262 5th edition, section 8.12.5. 111251e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetProperty( 111351e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org Handle<Object> object, Handle<Name> key, Handle<Object> value, 111451e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org StrictMode strict_mode, 111551e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED); 111651e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org 1117474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetProperty( 1118474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org LookupIterator* it, Handle<Object> value, StrictMode strict_mode, 1119474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org StoreFromKeyed store_mode); 1120474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> WriteToReadOnlyProperty( 1121474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org LookupIterator* it, Handle<Object> value, StrictMode strict_mode); 1122a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static Handle<Object> SetDataProperty(LookupIterator* it, 1123a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Handle<Object> value); 1124474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> AddDataProperty( 1125474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, 1126474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org StrictMode strict_mode, StoreFromKeyed store_mode); 11272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( 1128202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<Object> object, 1129202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<Name> key); 11309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 11319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Isolate* isolate, 11329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Object> object, 11339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org const char* key); 11342ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 11352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Object> object, 11362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Name> key); 1137394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 11388ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithAccessor( 1139e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org Handle<Object> receiver, 1140e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org Handle<Name> name, 1141e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org Handle<JSObject> holder, 1142e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org Handle<Object> structure); 1143474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithAccessor( 1144474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<Object> receiver, Handle<Name> name, Handle<Object> value, 1145474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<JSObject> holder, Handle<Object> structure, 1146e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org StrictMode strict_mode); 1147e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org 1148202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithDefinedGetter( 1149202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<Object> receiver, 1150202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<JSReceiver> getter); 1151e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithDefinedSetter( 1152e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org Handle<Object> receiver, 1153e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org Handle<JSReceiver> setter, 1154e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org Handle<Object> value); 1155303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 1156202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MUST_USE_RESULT static inline MaybeHandle<Object> GetElement( 1157202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Isolate* isolate, 1158202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<Object> object, 1159202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org uint32_t index); 11604452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 1161202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetElementWithReceiver( 1162202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Isolate* isolate, 1163202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<Object> object, 1164202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<Object> receiver, 1165202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org uint32_t index); 116643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1167057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Returns the permanent hash code associated with this object. May return 1168057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // undefined if not yet created. 1169057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Object* GetHash(); 1170057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 1171394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Returns the permanent hash code associated with this object depending on 1172057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // the actual object type. May create and store a hash code if needed and none 1173057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // exists. 11743c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static Handle<Smi> GetOrCreateHash(Isolate* isolate, Handle<Object> object); 1175394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 1176394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Checks whether this object has the same value as the given one. This 1177394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // function is implemented according to ES5, section 9.12 and can be used 1178394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // to implement the Harmony "egal" function. 1179394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com bool SameValue(Object* other); 1180394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 118179d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org // Checks whether this object has the same value as the given one. 118279d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org // +0 and -0 are treated equal. Everything else is the same as SameValue. 118379d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org // This function is implemented according to ES6, section 7.2.4 and is used 118479d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org // by ES6 Map and Set. 118579d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org bool SameValueZero(Object* other); 118679d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org 118730ce411529579186181838984710b0b0980857aaricow@chromium.org // Tries to convert an object to an array index. Returns true and sets 118830ce411529579186181838984710b0b0980857aaricow@chromium.org // the output parameter if it succeeds. 118930ce411529579186181838984710b0b0980857aaricow@chromium.org inline bool ToArrayIndex(uint32_t* index); 119030ce411529579186181838984710b0b0980857aaricow@chromium.org 119143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns true if this is a JSValue containing a string and the index is 119243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // < the length of the string. Used to implement [] on strings. 119343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool IsStringObjectWithCharacterAt(uint32_t index); 119443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1195ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DECLARE_VERIFIER(Object) 1196c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 119743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Verify a pointer is a valid object pointer. 119843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void VerifyPointer(Object* p); 119943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 120043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1201de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org inline void VerifyApiCallResultType(); 1202de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Prints this object without details. 1204dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org void ShortPrint(FILE* out = stdout); 120543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 120643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Prints this object without details to a message accumulator. 120743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void ShortPrint(StringStream* accumulator); 120843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1209975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Object) 121043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 121143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 1212236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kHeaderSize = 0; // Object does not take up any space. 121343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1214a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org#ifdef OBJECT_PRINT 1215f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org // For our gdb macros, we should perhaps change these in the future. 1216f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org void Print(); 1217f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org 1218a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // Prints this object with details. 1219f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void Print(OStream& os); // NOLINT 1220a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org#endif 1221a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 122243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 12239bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org friend class LookupIterator; 12249bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org friend class PrototypeIterator; 12259bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org 12269bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org // Return the map of the root of object's prototype chain. 12279bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org Map* GetRootMap(Isolate* isolate); 12289bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org 122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(Object); 123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1233f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgstruct Brief { 1234f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org explicit Brief(const Object* const v) : value(v) {} 1235f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org const Object* value; 1236f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org}; 1237f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 1238f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 1239f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const Brief& v); 1240f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 1241f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 124243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Smi represents integer Numbers that can be stored in 31 bits. 124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Smis are immediate which means they are NOT allocated in the heap. 12444af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org// The this pointer has the following format: [31 bit signed int] 0 12459d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// For long smis it has the following format: 12469d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// [32 bit signed int] [31 bits zero padding] 0 12479d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// Smi stands for small integer. 124843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Smi: public Object { 124943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 125043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the integer value. 12514b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int value() const; 125243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Convert a value to a Smi object. 125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline Smi* FromInt(int value); 125543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12569085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org static inline Smi* FromIntptr(intptr_t value); 12579085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns whether value can be represented in a Smi. 1259ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org static inline bool IsValid(intptr_t value); 126043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1261975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Smi) 126243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 1264f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void SmiPrint(OStream& os) const; // NOLINT 1265c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(Smi) 126643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1267f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org static const int kMinValue = 1268f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org (static_cast<unsigned int>(-1)) << (kSmiValueSize - 1); 12699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com static const int kMaxValue = -(kMinValue + 1); 127043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 127143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 127243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(Smi); 127343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 127443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 127543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12767276f14ca716596e0a0d17539516370c1f453847kasper.lund// Heap objects typically have a map pointer in their first word. However, 12772efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// during GC other data (e.g. mark bits, forwarding addresses) is sometimes 12787276f14ca716596e0a0d17539516370c1f453847kasper.lund// encoded in the first word. The class MapWord is an abstraction of the 12797276f14ca716596e0a0d17539516370c1f453847kasper.lund// value in a heap object's first word. 12807276f14ca716596e0a0d17539516370c1f453847kasper.lundclass MapWord BASE_EMBEDDED { 12817276f14ca716596e0a0d17539516370c1f453847kasper.lund public: 12827276f14ca716596e0a0d17539516370c1f453847kasper.lund // Normal state: the map word contains a map pointer. 12837276f14ca716596e0a0d17539516370c1f453847kasper.lund 12847276f14ca716596e0a0d17539516370c1f453847kasper.lund // Create a map word from a map pointer. 12854b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org static inline MapWord FromMap(const Map* map); 12867276f14ca716596e0a0d17539516370c1f453847kasper.lund 12877276f14ca716596e0a0d17539516370c1f453847kasper.lund // View this map word as a map pointer. 12887276f14ca716596e0a0d17539516370c1f453847kasper.lund inline Map* ToMap(); 12897276f14ca716596e0a0d17539516370c1f453847kasper.lund 12907276f14ca716596e0a0d17539516370c1f453847kasper.lund 12917276f14ca716596e0a0d17539516370c1f453847kasper.lund // Scavenge collection: the map word of live objects in the from space 12927276f14ca716596e0a0d17539516370c1f453847kasper.lund // contains a forwarding address (a heap object pointer in the to space). 12937276f14ca716596e0a0d17539516370c1f453847kasper.lund 12947276f14ca716596e0a0d17539516370c1f453847kasper.lund // True if this map word is a forwarding address for a scavenge 12957276f14ca716596e0a0d17539516370c1f453847kasper.lund // collection. Only valid during a scavenge collection (specifically, 12962efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // when all map words are heap object pointers, i.e. not during a full GC). 12977276f14ca716596e0a0d17539516370c1f453847kasper.lund inline bool IsForwardingAddress(); 12987276f14ca716596e0a0d17539516370c1f453847kasper.lund 12997276f14ca716596e0a0d17539516370c1f453847kasper.lund // Create a map word from a forwarding address. 13007276f14ca716596e0a0d17539516370c1f453847kasper.lund static inline MapWord FromForwardingAddress(HeapObject* object); 13017276f14ca716596e0a0d17539516370c1f453847kasper.lund 13027276f14ca716596e0a0d17539516370c1f453847kasper.lund // View this map word as a forwarding address. 13037276f14ca716596e0a0d17539516370c1f453847kasper.lund inline HeapObject* ToForwardingAddress(); 13047276f14ca716596e0a0d17539516370c1f453847kasper.lund 1305c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static inline MapWord FromRawValue(uintptr_t value) { 1306c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return MapWord(value); 1307c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 13087276f14ca716596e0a0d17539516370c1f453847kasper.lund 1309c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline uintptr_t ToRawValue() { 1310c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return value_; 1311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1312defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 1313defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org private: 1314defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // HeapObject calls the private constructor and directly reads the value. 1315defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org friend class HeapObject; 1316defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 1317defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org explicit MapWord(uintptr_t value) : value_(value) {} 1318defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 1319defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org uintptr_t value_; 13207276f14ca716596e0a0d17539516370c1f453847kasper.lund}; 13217276f14ca716596e0a0d17539516370c1f453847kasper.lund 13227276f14ca716596e0a0d17539516370c1f453847kasper.lund 132343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HeapObject is the superclass for all classes describing heap allocated 132443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// objects. 132543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass HeapObject: public Object { 132643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 13277276f14ca716596e0a0d17539516370c1f453847kasper.lund // [map]: Contains a map which contains the object's reflective 13287276f14ca716596e0a0d17539516370c1f453847kasper.lund // information. 13294b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline Map* map() const; 133043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_map(Map* value); 133164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // The no-write-barrier version. This is OK if the object is white and in 133264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // new space, or if the value is an immortal immutable object, like the maps 133364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // of primitive (non-JS) objects like strings, heap numbers etc. 133464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org inline void set_map_no_write_barrier(Map* value); 133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 133663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org // Get the map using acquire load. 133763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org inline Map* synchronized_map(); 13384b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline MapWord synchronized_map_word() const; 133963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org 134063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org // Set the map using release store 134163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org inline void synchronized_set_map(Map* value); 13429e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org inline void synchronized_set_map_no_write_barrier(Map* value); 134363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org inline void synchronized_set_map_word(MapWord map_word); 134463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org 13457276f14ca716596e0a0d17539516370c1f453847kasper.lund // During garbage collection, the map word of a heap object does not 13467276f14ca716596e0a0d17539516370c1f453847kasper.lund // necessarily contain a map pointer. 13474b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline MapWord map_word() const; 13487276f14ca716596e0a0d17539516370c1f453847kasper.lund inline void set_map_word(MapWord map_word); 13497276f14ca716596e0a0d17539516370c1f453847kasper.lund 1350ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // The Heap the object was allocated in. Used also to access Isolate. 13514b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline Heap* GetHeap() const; 1352c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 13532c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org // Convenience method to get current isolate. 135408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inline Isolate* GetIsolate() const; 1355ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 135643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Converts an address to a HeapObject pointer. 135743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline HeapObject* FromAddress(Address address); 135843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 135943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the address of this HeapObject. 136043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Address address(); 136143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 136243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterates over pointers contained in the object (including the Map) 136343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Iterate(ObjectVisitor* v); 136443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 136543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterates over all pointers contained in the object except the 136643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // first map pointer. The object type is given in the first 136743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // parameter. This function does not access the map pointer in the 136843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // object, and so is safe to call while the map pointer is modified. 136943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); 137043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 137143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the heap object's size in bytes 137243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int Size(); 137343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Returns true if this heap object may contain raw values, i.e., values that 13752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // look like pointers to heap objects. 13762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline bool MayContainRawValues(); 1377f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 137843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Given a heap object's map pointer, returns the heap size in bytes 137943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Useful when the map pointer field is used for other purposes. 138043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // GC internal. 138143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int SizeFromMap(Map* map); 138243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13839bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // Returns the field at offset in obj, as a read/write Object* reference. 13849bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // Does no checking, and is safe to use during GC, while maps are invalid. 138530ce411529579186181838984710b0b0980857aaricow@chromium.org // Does not invoke write barrier, so should only be assigned to 13869bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // during marking GC. 13879bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org static inline Object** RawField(HeapObject* obj, int offset); 138843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13894a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Adds the |code| object related to |name| to the code cache of this map. If 13904a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // this map is a dictionary map that is shared, the map copied and installed 13914a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // onto the object. 13924a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org static void UpdateMapCodeCache(Handle<HeapObject> object, 13934a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org Handle<Name> name, 13944a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org Handle<Code> code); 13954a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 1396975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(HeapObject) 139743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1398b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Return the write barrier mode for this. Callers of this function 1399837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org // must be able to present a reference to an DisallowHeapAllocation 1400b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // object as a sign that they are not going to use this function 1401b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // from code that allocates and thus invalidates the returned write 1402b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // barrier mode. 140379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org inline WriteBarrierMode GetWriteBarrierMode( 140479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org const DisallowHeapAllocation& promise); 14055a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 140643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 1407f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void HeapObjectShortPrint(OStream& os); // NOLINT 1408023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#ifdef OBJECT_PRINT 1409f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void PrintHeader(OStream& os, const char* id); // NOLINT 1410023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#endif 1411dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org DECLARE_PRINTER(HeapObject) 1412c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(HeapObject) 1413c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 141443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void VerifyObjectField(int offset); 141530ce411529579186181838984710b0b0980857aaricow@chromium.org inline void VerifySmiField(int offset); 141643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 141743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Verify a pointer is a valid HeapObject pointer that points to object 141843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // areas in the heap. 141943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void VerifyHeapPointer(Object* p); 142043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 142143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 142243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 142343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // First field in a heap object is map. 1424236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kMapOffset = Object::kHeaderSize; 1425236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kHeaderSize = kMapOffset + kPointerSize; 142643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1427d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset); 142818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 142943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected: 143043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // helpers for calling an ObjectVisitor to iterate over pointers in the 143143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // half-open range [start, end) specified as integer offsets 143243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void IteratePointers(ObjectVisitor* v, int start, int end); 143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // as above, for the single element at "offset" 143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void IteratePointer(ObjectVisitor* v, int offset); 1435895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org // as above, for the next code link of a code object. 1436895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline void IterateNextCodeLink(ObjectVisitor* v, int offset); 143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject); 144043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 144143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1443ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// This class describes a body of an object of a fixed size 1444ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// in which all pointer fields are located in the [start_offset, end_offset) 1445ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// interval. 1446ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<int start_offset, int end_offset, int size> 1447ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass FixedBodyDescriptor { 1448ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 1449ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static const int kStartOffset = start_offset; 1450ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static const int kEndOffset = end_offset; 1451ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static const int kSize = size; 1452ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1453ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void IterateBody(HeapObject* obj, ObjectVisitor* v); 1454ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1455ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<typename StaticVisitor> 1456ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void IterateBody(HeapObject* obj) { 1457471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org StaticVisitor::VisitPointers(HeapObject::RawField(obj, start_offset), 1458471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org HeapObject::RawField(obj, end_offset)); 1459ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 1460ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 1461ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1462ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1463ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// This class describes a body of an object of a variable size 1464ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// in which all pointer fields are located in the [start_offset, object_size) 1465ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// interval. 1466ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<int start_offset> 1467ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass FlexibleBodyDescriptor { 1468ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 1469ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static const int kStartOffset = start_offset; 1470ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1471ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void IterateBody(HeapObject* obj, 1472ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size, 1473ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org ObjectVisitor* v); 1474ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1475ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<typename StaticVisitor> 1476ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void IterateBody(HeapObject* obj, int object_size) { 1477471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org StaticVisitor::VisitPointers(HeapObject::RawField(obj, start_offset), 1478471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org HeapObject::RawField(obj, object_size)); 1479ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 1480ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 1481ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1482ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 148343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The HeapNumber class describes heap allocated numbers that cannot be 148443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// represented in a Smi (small integer) 148543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass HeapNumber: public HeapObject { 148643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 148743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [value]: number value. 148808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inline double value() const; 148943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_value(double value); 149043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1491975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(HeapNumber) 149243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 14949faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org bool HeapNumberBooleanValue(); 14959faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org 1496f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void HeapNumberPrint(OStream& os); // NOLINT 1497c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(HeapNumber) 149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1499cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org inline int get_exponent(); 1500cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org inline int get_sign(); 1501cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 150243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 1503236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kValueOffset = HeapObject::kHeaderSize; 1504eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // IEEE doubles are two 32 bit words. The first is just mantissa, the second 1505731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org // is a mixture of sign, exponent and mantissa. The offsets of two 32 bit 1506731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org // words within double numbers are endian dependent and they are set 1507731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org // accordingly. 1508731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#if defined(V8_TARGET_LITTLE_ENDIAN) 1509eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const int kMantissaOffset = kValueOffset; 1510eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const int kExponentOffset = kValueOffset + 4; 1511731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#elif defined(V8_TARGET_BIG_ENDIAN) 1512731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org static const int kMantissaOffset = kValueOffset + 4; 1513731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org static const int kExponentOffset = kValueOffset; 1514731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#else 1515731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#error Unknown byte ordering 1516731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#endif 151744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 151843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kValueOffset + kDoubleSize; 1519eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const uint32_t kSignMask = 0x80000000u; 1520eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const uint32_t kExponentMask = 0x7ff00000u; 1521eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const uint32_t kMantissaMask = 0xfffffu; 1522ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org static const int kMantissaBits = 52; 15232c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static const int kExponentBits = 11; 1524eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const int kExponentBias = 1023; 1525eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const int kExponentShift = 20; 1526e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static const int kInfinityOrNanExponent = 1527e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org (kExponentMask >> kExponentShift) - kExponentBias; 1528eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const int kMantissaBitsInTopWord = 20; 1529eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org static const int kNonMantissaBitsInTopWord = 12; 1530eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 153243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(HeapNumber); 153343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 153543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 153664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgenum EnsureElementsMode { 153764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org DONT_ALLOW_DOUBLE_ELEMENTS, 153864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org ALLOW_COPIED_DOUBLE_ELEMENTS, 153964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org ALLOW_CONVERTED_DOUBLE_ELEMENTS 154064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}; 154164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 154264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 1543ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// Indicates whether a property should be set or (re)defined. Setting of a 1544ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// property causes attributes to remain unchanged, writability to be checked 1545ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// and callbacks to be called. Defining of a property causes attributes to 1546ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// be updated and callbacks to be overridden. 1547ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgenum SetPropertyMode { 1548ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org SET_PROPERTY, 1549ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org DEFINE_PROPERTY 1550ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org}; 1551ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 1552ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 15539a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// Indicator for one component of an AccessorPair. 15549a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgenum AccessorComponent { 15559a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org ACCESSOR_GETTER, 15569a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org ACCESSOR_SETTER 15579a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}; 15589a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 15599a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 1560d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// JSReceiver includes types on which properties can be defined, i.e., 1561d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// JSObject and JSProxy. 1562d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgclass JSReceiver: public HeapObject { 1563d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org public: 156484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org enum DeleteMode { 156584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org NORMAL_DELETION, 156684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org STRICT_DELETION, 156784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org FORCE_DELETION 156884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org }; 156984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 1570975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSReceiver) 1571d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 15729e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetElement( 15739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSReceiver> object, 15749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org uint32_t index, 15759e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> value, 15769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org PropertyAttributes attributes, 15779e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org StrictMode strict_mode); 157877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org 1579528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6. 1580eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<bool> HasProperty( 1581eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> object, Handle<Name> name); 1582eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<bool> HasOwnProperty(Handle<JSReceiver>, 1583eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Name> name); 1584eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<bool> HasElement( 1585eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> object, uint32_t index); 1586eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<bool> HasOwnElement( 1587eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> object, uint32_t index); 1588d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1589528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Implementation of [[Delete]], ECMA-262 5th edition, section 8.12.7. 15909e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty( 15919e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSReceiver> object, 15929e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Name> name, 15939e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org DeleteMode mode = NORMAL_DELETION); 15949e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeleteElement( 15959e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSReceiver> object, 15969e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org uint32_t index, 15979e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org DeleteMode mode = NORMAL_DELETION); 1598c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1599394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Tests for the fast common case for property enumeration. 1600394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com bool IsSimpleEnum(); 1601394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 1602d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Returns the class name ([[Class]] property in the specification). 1603d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org String* class_name(); 1604d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1605d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Returns the constructor name (the name (possibly, inferred name) of the 1606d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // function that was used to instantiate the object). 1607d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org String* constructor_name(); 1608d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1609eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetPropertyAttributes( 1610eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> object, Handle<Name> name); 1611eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes( 1612eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org LookupIterator* it); 1613eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> GetOwnPropertyAttributes( 1614eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> object, Handle<Name> name); 1615d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1616eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetElementAttribute( 1617eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> object, uint32_t index); 1618eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<PropertyAttributes> 1619eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetOwnElementAttribute(Handle<JSReceiver> object, uint32_t index); 1620e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1621c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org // Return the constructor function (may be Heap::null_value()). 1622c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org inline Object* GetConstructor(); 1623c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org 1624c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Retrieves a permanent object identity hash code. The undefined value might 1625057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // be returned in case no hash was created yet. 1626057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org inline Object* GetIdentityHash(); 1627057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 1628057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Retrieves a permanent object identity hash code. May create and store a 1629057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // hash code if needed and none exists. 16303c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org inline static Handle<Smi> GetOrCreateIdentityHash( 1631057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Handle<JSReceiver> object); 1632c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1633fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org enum KeyCollectionType { OWN_ONLY, INCLUDE_PROTOS }; 16349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 16359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Computes the enumerable keys for a JSObject. Used for implementing 16369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // "for (n in object) { }". 16379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<FixedArray> GetKeys( 16389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<JSReceiver> object, 16399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org KeyCollectionType type); 16409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1641d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org private: 1642d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver); 1643d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}; 1644d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1645057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org// Forward declaration for JSObject::GetOrCreateHiddenPropertiesHashTable. 1646057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgclass ObjectHashTable; 1647057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 1648731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org// Forward declaration for JSObject::Copy. 1649731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.orgclass AllocationSite; 1650731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org 1651731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org 165243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The JSObject describes real heap allocated JavaScript objects with 165343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// properties. 165443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Note that the map of JSObject changes during execution to enable inline 165543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// caching. 1656d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgclass JSObject: public JSReceiver { 165743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 165843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [properties]: Backing storage for properties. 165930ce411529579186181838984710b0b0980857aaricow@chromium.org // properties is a FixedArray in the fast case and a Dictionary in the 16609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // slow case. 16619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties. 166243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void initialize_properties(); 166343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool HasFastProperties(); 1664750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline NameDictionary* property_dictionary(); // Gets slow properties. 166543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // [elements]: The elements (properties with names that are integers). 16670b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // 16680b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // Elements can be in two general modes: fast and slow. Each mode 16690b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // corrensponds to a set of object representations of elements that 16700b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // have something in common. 16710b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // 16720b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // In the fast mode elements is a FixedArray and so each element can 16730b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // be quickly accessed. This fact is used in the generated code. The 16747b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // elements array can have one of three maps in this mode: 1675486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // fixed_array_map, sloppy_arguments_elements_map or 16767b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // fixed_cow_array_map (for copy-on-write arrays). In the latter case 16777b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // the elements array may be shared by a few objects and so before 16787b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // writing to any element the array must be copied. Use 16797b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // EnsureWritableFastElements in this case. 16800b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // 16817b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // In the slow mode the elements is either a NumberDictionary, an 1682486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // ExternalArray, or a FixedArray parameter map for a (sloppy) 16837b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // arguments object. 16844acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org DECL_ACCESSORS(elements, FixedArrayBase) 16859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com inline void initialize_elements(); 168663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org static void ResetElements(Handle<JSObject> object); 168763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org static inline void SetMapAndElements(Handle<JSObject> object, 168863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org Handle<Map> map, 168963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org Handle<FixedArrayBase> elements); 16900b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org inline ElementsKind GetElementsKind(); 16917c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline ElementsAccessor* GetElementsAccessor(); 1692830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // Returns true if an object has elements of FAST_SMI_ELEMENTS ElementsKind. 1693830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org inline bool HasFastSmiElements(); 1694830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // Returns true if an object has elements of FAST_ELEMENTS ElementsKind. 1695830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org inline bool HasFastObjectElements(); 1696830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // Returns true if an object has elements of FAST_ELEMENTS or 1697830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // FAST_SMI_ONLY_ELEMENTS. 1698830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org inline bool HasFastSmiOrObjectElements(); 1699fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org // Returns true if an object has any of the fast elements kinds. 1700fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org inline bool HasFastElements(); 1701830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // Returns true if an object has elements of FAST_DOUBLE_ELEMENTS 1702830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // ElementsKind. 17036d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org inline bool HasFastDoubleElements(); 1704830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // Returns true if an object has elements of FAST_HOLEY_*_ELEMENTS 1705830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // ElementsKind. 1706830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org inline bool HasFastHoleyElements(); 1707486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org inline bool HasSloppyArgumentsElements(); 17080b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org inline bool HasDictionaryElements(); 17095c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 1710af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalUint8ClampedElements(); 17113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline bool HasExternalArrayElements(); 1712af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalInt8Elements(); 1713af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalUint8Elements(); 1714af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalInt16Elements(); 1715af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalUint16Elements(); 1716af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalInt32Elements(); 1717af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalUint32Elements(); 1718af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalFloat32Elements(); 1719af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline bool HasExternalFloat64Elements(); 17205c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 17215c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org inline bool HasFixedTypedArrayElements(); 17225c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 1723895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedUint8ClampedElements(); 1724895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedArrayElements(); 1725895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedInt8Elements(); 1726895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedUint8Elements(); 1727895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedInt16Elements(); 1728895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedUint16Elements(); 1729895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedInt32Elements(); 1730895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedUint32Elements(); 1731895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedFloat32Elements(); 1732895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline bool HasFixedFloat64Elements(); 1733895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 17347b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org bool HasFastArgumentsElements(); 17357b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org bool HasDictionaryArgumentsElements(); 1736f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com inline SeededNumberDictionary* element_dictionary(); // Gets slow elements. 17377b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 17387b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // Requires: HasFastElements(). 1739ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org static Handle<FixedArray> EnsureWritableFastElements( 1740ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org Handle<JSObject> object); 174143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17425ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Collects elements starting at index 0. 17435ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Undefined values are placed after non-undefined values. 17445ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Returns the number of non-undefined values. 1745ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org static Handle<Object> PrepareElementsForSort(Handle<JSObject> object, 1746ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org uint32_t limit); 17475ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // As PrepareElementsForSort, but only on objects where elements is 1748e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // a dictionary, and it will stay a dictionary. Collates undefined and 1749e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // unexisting elements below limit from position zero of the elements. 1750ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org static Handle<Object> PrepareSlowElementsForSort(Handle<JSObject> object, 1751ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org uint32_t limit); 1752303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 17538f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithInterceptor( 1754474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org LookupIterator* it, Handle<Object> value); 1755f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 1756e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org // SetLocalPropertyIgnoreAttributes converts callbacks to fields. We need to 1757e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org // grant an exemption to ExecutableAccessor callbacks in some cases. 1758e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org enum ExecutableAccessorInfoHandling { 1759e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org DEFAULT_HANDLING, 1760e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org DONT_FORCE_FIELD 1761e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org }; 1762e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org 1763fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetOwnPropertyIgnoreAttributes( 1764f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<JSObject> object, 1765750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<Name> key, 1766f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<Object> value, 17671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org PropertyAttributes attributes, 1768e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org ExecutableAccessorInfoHandling handling = DEFAULT_HANDLING); 1769f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 17709d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org static void AddProperty(Handle<JSObject> object, Handle<Name> key, 17719d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org Handle<Object> value, PropertyAttributes attributes); 17725de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org 177389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org // Extend the receiver with a single fast property appeared first in the 177489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org // passed map. This also extends the property backing store if necessary. 177557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static void AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map); 177689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 17773d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // Migrates the given object to a map whose field representations are the 17783d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // lowest upper bound of all known representations for that field. 1779f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org static void MigrateInstance(Handle<JSObject> instance); 1780f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 17813d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // Migrates the given object only if the target map is already available, 1782a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org // or returns false if such a map is not yet available. 1783a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org static bool TryMigrateInstance(Handle<JSObject> instance); 1784a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 17852abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // Sets the property value in a normalized object given (key, value, details). 17862abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // Handles the special representation of JS global objects. 1787528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static void SetNormalizedProperty(Handle<JSObject> object, 1788528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<Name> key, 1789528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<Object> value, 1790528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org PropertyDetails details); 17912abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 179231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org static void OptimizeAsPrototype(Handle<JSObject> object, 179331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org PrototypeOptimizationMode mode); 1794e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org static void ReoptimizeIfPrototype(Handle<JSObject> object); 17957028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 179643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Retrieve interceptors. 179743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InterceptorInfo* GetNamedInterceptor(); 179843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InterceptorInfo* GetIndexedInterceptor(); 179943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1800d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Used from JSReceiver. 1801eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> 1802eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetPropertyAttributesWithInterceptor(Handle<JSObject> holder, 1803eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Object> receiver, 1804eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Name> name); 1805eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> 1806eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetPropertyAttributesWithFailedAccessCheck(LookupIterator* it); 1807eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> 1808eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetElementAttributeWithReceiver(Handle<JSObject> object, 1809eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> receiver, 1810eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org uint32_t index, bool check_prototype); 181143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1812fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org // Retrieves an AccessorPair property from the given object. Might return 1813fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org // undefined if the property doesn't exist or is of a different kind. 18148496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetAccessor( 18158496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<JSObject> object, 18168496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<Name> name, 18178496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org AccessorComponent component); 1818fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org 1819fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org // Defines an AccessorPair property on the given object. 1820eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org // TODO(mstarzinger): Rename to SetAccessor(). 1821eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org static MaybeHandle<Object> DefineAccessor(Handle<JSObject> object, 1822eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Name> name, 1823eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Object> getter, 1824eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Object> setter, 1825eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org PropertyAttributes attributes); 1826c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org 1827fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org // Defines an AccessorInfo property on the given object. 18288496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetAccessor( 18298496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<JSObject> object, 18308496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<AccessorInfo> info); 18319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 18328f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithInterceptor( 1833dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org Handle<JSObject> object, 1834dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org Handle<Object> receiver, 18358ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org Handle<Name> name); 18363a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org 18372bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com // Returns true if this is an instance of an api function and has 18382bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com // been modified since it was created. May give false positives. 18392bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com bool IsDirty(); 18402bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com 1841c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Accessors for hidden properties object. 1842c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // 1843fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // Hidden properties are not own properties of the object itself. 1844fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // Instead they are stored in an auxiliary structure kept as an own 18454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // property with a special name Heap::hidden_string(). But if the 1846c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // receiver is a JSGlobalProxy then the auxiliary object is a property 1847c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // of its prototype, and if it's a detached proxy, then you can't have 1848c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // hidden properties. 1849c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1850c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Sets a hidden property on this object. Returns this object if successful, 1851f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // undefined if called on a detached proxy. 1852057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static Handle<Object> SetHiddenProperty(Handle<JSObject> object, 1853750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<Name> key, 1854f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<Object> value); 18551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Gets the value of a hidden property with the given key. Returns the hole 1856c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // if the property doesn't exist (or if called on a detached proxy), 1857c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // otherwise returns the value set for the key. 18583484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Object* GetHiddenProperty(Handle<Name> key); 1859c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Deletes a hidden property. Deleting a non-existing property is 1860c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // considered successful. 18618fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org static void DeleteHiddenProperty(Handle<JSObject> object, 18628fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org Handle<Name> key); 18634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Returns true if the object has a property with the hidden string as name. 1864381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org static bool HasHiddenProperties(Handle<JSObject> object); 1865c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1866057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static void SetIdentityHash(Handle<JSObject> object, Handle<Smi> hash); 18677943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org 186849ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org static inline void ValidateElements(Handle<JSObject> object); 1869c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 187064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // Makes sure that this object can contain HeapObject as elements. 1871c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org static inline void EnsureCanContainHeapObjectElements(Handle<JSObject> obj); 1872c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1873c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Makes sure that this object can contain the specified elements. 1874a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org static inline void EnsureCanContainElements( 1875a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Handle<JSObject> object, 1876f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org Object** elements, 1877f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org uint32_t count, 1878f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org EnsureElementsMode mode); 1879fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org static inline void EnsureCanContainElements( 1880fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org Handle<JSObject> object, 1881fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org Handle<FixedArrayBase> elements, 1882fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org uint32_t length, 1883fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org EnsureElementsMode mode); 18844452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org static void EnsureCanContainElements( 18854452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org Handle<JSObject> object, 18864452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org Arguments* arguments, 18874452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org uint32_t first_arg, 18884452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org uint32_t arg_count, 18894452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org EnsureElementsMode mode); 1890c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 189150bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org // Would we convert a fast elements array to dictionary mode given 189250bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org // an access at key? 189350bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org bool WouldConvertToSlowElements(Handle<Object> key); 18949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Do we want to keep the elements in fast case when increasing the 18959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // capacity? 18969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bool ShouldConvertToSlowElements(int new_capacity); 189743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns true if the backing storage for the slow-case elements of 189843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // this object takes up nearly as much space as a fast-case backing 189943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // storage would. In that case the JSObject should have fast 190043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // elements. 19019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bool ShouldConvertToFastElements(); 19026d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Returns true if the elements of JSObject contains only values that can be 19033c93e774a3c6dc64c4d10d9cc7d5e071f0e8a28esvenpanne@chromium.org // represented in a FixedDoubleArray and has at least one value that can only 19043c93e774a3c6dc64c4d10d9cc7d5e071f0e8a28esvenpanne@chromium.org // be represented as a double and not a Smi. 19053c93e774a3c6dc64c4d10d9cc7d5e071f0e8a28esvenpanne@chromium.org bool ShouldConvertToFastDoubleElements(bool* has_smi_only_elements); 190643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19078f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org // Computes the new capacity when expanding the elements of a JSObject. 19088f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org static int NewElementsCapacity(int old_capacity) { 19098f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org // (old_capacity + 50%) + 16 19108f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org return old_capacity + (old_capacity >> 1) + 16; 19118f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org } 19128f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org 19138e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // These methods do not perform access checks! 1914fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<AccessorPair> GetOwnElementAccessorPair( 191549ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org Handle<JSObject> object, 191649ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org uint32_t index); 191743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19189e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetFastElement( 19199e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSObject> object, 19209e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org uint32_t index, 19219e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> value, 19229e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org StrictMode strict_mode, 19239e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org bool check_prototype); 19246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 19259e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetOwnElement( 19269e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSObject> object, 19279e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org uint32_t index, 19289e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> value, 19299e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org StrictMode strict_mode); 1930f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 1931f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Empty handle is returned if the element cannot be set to the given value. 19329e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetElement( 1933ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org Handle<JSObject> object, 1934ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org uint32_t index, 1935ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org Handle<Object> value, 1936ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org PropertyAttributes attributes, 1937486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode, 1938ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org bool check_prototype = true, 1939ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org SetPropertyMode set_mode = SET_PROPERTY); 194043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 194143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the index'th element. 194243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The undefined object if index is out of bounds. 1943202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetElementWithInterceptor( 1944202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<JSObject> object, 1945202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<Object> receiver, 1946202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org uint32_t index); 194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1948830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org enum SetFastElementsCapacitySmiMode { 1949830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org kAllowSmiElements, 1950830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org kForceSmiElements, 1951830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org kDontAllowSmiElements 1952c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com }; 1953c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 19547b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // Replace the elements' backing store with fast elements of the given 19557b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // capacity. Update the length for JSArrays. Returns the new backing 19567b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // store. 19579b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org static Handle<FixedArray> SetFastElementsCapacityAndLength( 19589b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org Handle<JSObject> object, 1959c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int capacity, 1960c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int length, 1961830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org SetFastElementsCapacitySmiMode smi_mode); 1962b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org static void SetFastDoubleElementsCapacityAndLength( 1963b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<JSObject> object, 1964b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org int capacity, 1965b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org int length); 196643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 196743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Lookup interceptors are used for handling properties controlled by host 196843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // objects. 196943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool HasNamedInterceptor(); 197043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool HasIndexedInterceptor(); 197143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Computes the enumerable keys from interceptors. Used for debug mirrors and 19739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // by JSReceiver::GetKeys. 19743484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org MUST_USE_RESULT static MaybeHandle<JSObject> GetKeysForNamedInterceptor( 19759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<JSObject> object, 19769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<JSReceiver> receiver); 19773484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org MUST_USE_RESULT static MaybeHandle<JSObject> GetKeysForIndexedInterceptor( 19789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<JSObject> object, 19799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<JSReceiver> receiver); 19809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 198143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Support functions for v8 api (needed for correct interceptor behavior). 1982eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<bool> HasRealNamedProperty( 1983eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSObject> object, Handle<Name> key); 1984eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<bool> HasRealElementProperty( 1985eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSObject> object, uint32_t index); 1986eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<bool> HasRealNamedCallbackProperty( 1987eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSObject> object, Handle<Name> key); 198843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 198943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the header size for a JSObject. Used to compute the index of 199043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // internal fields as well as the number of internal fields. 199143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int GetHeaderSize(); 199243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 199343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int GetInternalFieldCount(); 1994ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline int GetInternalFieldOffset(int index); 199543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Object* GetInternalField(int index); 199643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void SetInternalField(int index, Object* value); 199727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org inline void SetInternalField(int index, Smi* value); 199843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 199943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of properties on this object filtering out properties 200043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // with the specified attributes (ignoring interceptors). 2001fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org int NumberOfOwnProperties(PropertyAttributes filter = NONE); 2002ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Fill in details for properties into storage starting at the specified 20038a89641487507e4209d584f03d024a6f76278c1fmachenbach@chromium.org // index. 20048a89641487507e4209d584f03d024a6f76278c1fmachenbach@chromium.org void GetOwnPropertyNames( 20058a89641487507e4209d584f03d024a6f76278c1fmachenbach@chromium.org FixedArray* storage, int index, PropertyAttributes filter = NONE); 200643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 200743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of properties on this object filtering out properties 200843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // with the specified attributes (ignoring interceptors). 2009fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org int NumberOfOwnElements(PropertyAttributes filter); 201043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of enumerable elements (ignoring interceptors). 201143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int NumberOfEnumElements(); 201243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of elements on this object filtering out elements 201343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // with the specified attributes (ignoring interceptors). 2014fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org int GetOwnElementKeys(FixedArray* storage, PropertyAttributes filter); 201543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Count and fill in the enumerable elements into storage. 201643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // (storage->length() == NumberOfEnumElements()). 201743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If storage is NULL, will count the elements without adding 201843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // them to any storage. 201943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of enumerable elements. 202043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int GetEnumElementKeys(FixedArray* storage); 202143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2022c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Returns a new map with all transitions dropped from the object's current 2023c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // map and the ElementsKind set. 2024394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static Handle<Map> GetElementsTransitionMap(Handle<JSObject> object, 2025394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com ElementsKind to_kind); 2026528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static void TransitionElementsKind(Handle<JSObject> object, 2027528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org ElementsKind to_kind); 2028f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 2029528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static void MigrateToMap(Handle<JSObject> object, Handle<Map> new_map); 203043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 203143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Convert the object to use the canonical dictionary 20320b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // representation. If the object is expected to have additional properties 20330b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // added this number can be indicated to have the backing store allocated to 20340b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // an initial capacity for holding these properties. 2035f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static void NormalizeProperties(Handle<JSObject> object, 2036f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com PropertyNormalizationMode mode, 2037f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com int expected_additional_properties); 2038f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 2039f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Convert and update the elements backing store to be a 2040f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // SeededNumberDictionary dictionary. Returns the backing after conversion. 2041f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static Handle<SeededNumberDictionary> NormalizeElements( 2042f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<JSObject> object); 2043f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 204443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Transform slow named properties to fast variants. 204508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org static void MigrateSlowToFast(Handle<JSObject> object, 204608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int unused_property_fields); 2047f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 20487c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // Access fast-case object properties at index. 204963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org static Handle<Object> FastPropertyAt(Handle<JSObject> object, 205063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org Representation representation, 2051e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org FieldIndex index); 2052e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org inline Object* RawFastPropertyAt(FieldIndex index); 2053e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org inline void FastPropertyAtPut(FieldIndex index, Object* value); 20549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void WriteToField(int descriptor, Object* value); 20557c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 2056bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Access to in object properties. 2057ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline int GetInObjectPropertyOffset(int index); 2058bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org inline Object* InObjectPropertyAt(int index); 20595a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org inline Object* InObjectPropertyAtPut(int index, 20605a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Object* value, 20615a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org WriteBarrierMode mode 20625a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org = UPDATE_WRITE_BARRIER); 20637c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 2064c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org // Set the object's prototype (only JSReceiver and null are allowed values). 2065a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetPrototype( 206631c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org Handle<JSObject> object, Handle<Object> value, bool from_javascript); 2067c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org 2068c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Initializes the body after properties slot, properties slot is 2069c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // initialized by set_properties. Fill the pre-allocated fields with 2070c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // pre_allocated_value and the rest with filler_value. 2071c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Note: this call does not update write barrier, the caller is responsible 2072c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // to ensure that |filler_value| can be collected without WB here. 2073c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void InitializeBody(Map* map, 2074c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* pre_allocated_value, 2075c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* filler_value); 207643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 207743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check whether this object references another object 207843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool ReferencesObject(Object* obj); 207943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 208069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org // Disalow further properties to be added to the object. 20818496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> PreventExtensions( 20828496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<JSObject> object); 208369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 2084a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org // ES5 Object.freeze 20858f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> Freeze(Handle<JSObject> object); 2086169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 2087169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Called the first time an object is observed with ES7 Object.observe. 2088b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org static void SetObserved(Handle<JSObject> object); 2089169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 2090528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Copy object. 2091f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org enum DeepCopyHints { kNoHints = 0, kObjectIsShallow = 1 }; 209237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 2093528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static Handle<JSObject> Copy(Handle<JSObject> object); 2094a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org MUST_USE_RESULT static MaybeHandle<JSObject> DeepCopy( 2095a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<JSObject> object, 2096a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org AllocationSiteUsageContext* site_context, 2097a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org DeepCopyHints hints = kNoHints); 2098a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org MUST_USE_RESULT static MaybeHandle<JSObject> DeepWalk( 2099a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<JSObject> object, 2100a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org AllocationSiteCreationContext* site_context); 2101528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 21022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static Handle<Object> GetDataProperty(Handle<JSObject> object, 21032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Name> key); 2104e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org static Handle<Object> GetDataProperty(LookupIterator* it); 21052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2106975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSObject) 210769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 210843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 210943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void JSObjectShortPrint(StringStream* accumulator); 2110a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSObject) 2111c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSObject) 2112023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#ifdef OBJECT_PRINT 2113f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void PrintProperties(OStream& os); // NOLINT 2114f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void PrintElements(OStream& os); // NOLINT 2115f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void PrintTransitions(OStream& os); // NOLINT 2116023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#endif 211743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21189b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org static void PrintElementsTransition( 21199b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org FILE* file, Handle<JSObject> object, 21209b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org ElementsKind from_kind, Handle<FixedArrayBase> from_elements, 21219b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org ElementsKind to_kind, Handle<FixedArrayBase> to_elements); 2122394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 212332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org void PrintInstanceMigration(FILE* file, Map* original_map, Map* new_map); 212432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org 2125023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#ifdef DEBUG 212643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Structure for collecting spill information about JSObjects. 212743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen class SpillInformation { 212843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 212943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Clear(); 213043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Print(); 213143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_objects_; 213243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_objects_with_fast_properties_; 213343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_objects_with_fast_elements_; 213443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_fast_used_fields_; 213543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_fast_unused_fields_; 213643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_slow_used_properties_; 213743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_slow_unused_properties_; 213843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_fast_used_elements_; 213943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_fast_unused_elements_; 214043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_slow_used_elements_; 214143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_slow_unused_elements_; 214243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 214343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 214443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void IncrementSpillStatistics(SpillInformation* info); 2145a6516eb7a6c347f1146a0c823994a333468d818amvstanton@chromium.org#endif 2146ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 2147a6516eb7a6c347f1146a0c823994a333468d818amvstanton@chromium.org#ifdef VERIFY_HEAP 2148ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org // If a GC was caused while constructing this object, the elements pointer 2149ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org // may point to a one pointer filler map. The object won't be rooted, but 2150ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org // our heap verification code could stumble across it. 2151ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org bool ElementsAreSafeToExamine(); 215243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 2153a6516eb7a6c347f1146a0c823994a333468d818amvstanton@chromium.org 215443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* SlowReverseLookup(Object* value); 215543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21560c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Maximal number of elements (numbered 0 .. kMaxElementCount - 1). 21570c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Also maximal value of JSArray's length property. 21580c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org static const uint32_t kMaxElementCount = 0xffffffffu; 21590c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 21602c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Constants for heuristics controlling conversion of fast elements 21612c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // to slow elements. 21622c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 21632c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Maximal gap that can be introduced by adding an element beyond 21642c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // the current elements length. 216543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const uint32_t kMaxGap = 1024; 21662c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 21672c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Maximal length of fast elements array that won't be checked for 21682c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // being dense enough on expansion. 21692c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org static const int kMaxUncheckedFastElementsLength = 5000; 21702c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 21712c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Same as above but for old arrays. This limit is more strict. We 21722c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // don't want to be wasteful with long lived objects. 21732c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org static const int kMaxUncheckedOldFastElementsLength = 500; 21742c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 2175ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org // Note that Page::kMaxRegularHeapObjectSize puts a limit on 2176e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org // permissible values (see the DCHECK in heap.cc). 2177e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org static const int kInitialMaxFastElementArray = 100000; 21781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2179011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // This constant applies only to the initial map of "$Object" aka 2180011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // "global.Object" and not to arbitrary other JSObject maps. 2181011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org static const int kInitialGlobalObjectUnusedPropertiesCount = 4; 2182011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 21837c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org static const int kMaxInstanceSize = 255 * kPointerSize; 21847c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // When extending the backing storage for property values, we increase 21857c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // its size by more than the 1 entry necessary, so sequentially adding fields 21867c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // to the same object requires fewer allocations and copies. 21877c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org static const int kFieldsAdded = 3; 218843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 218943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 2190236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kPropertiesOffset = HeapObject::kHeaderSize; 219143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kElementsOffset = kPropertiesOffset + kPointerSize; 219243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kHeaderSize = kElementsOffset + kPointerSize; 219343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2194d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize); 219518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 2196ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org class BodyDescriptor : public FlexibleBodyDescriptor<kPropertiesOffset> { 2197ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 2198ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline int SizeOf(Map* map, HeapObject* object); 2199ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org }; 2200ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 2201c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org Context* GetCreationContext(); 2202c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 2203e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // Enqueue change record for Object.observe. May cause GC. 2204e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org static void EnqueueChangeRecord(Handle<JSObject> object, 2205e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org const char* type, 2206750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<Name> name, 2207e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org Handle<Object> old_value); 2208e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 2209975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org static void MigrateToNewProperty(Handle<JSObject> object, 2210975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Handle<Map> transition, 2211975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Handle<Object> value); 2212975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 221343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 22147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org friend class DictionaryElementsAccessor; 2215ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org friend class JSReceiver; 2216dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org friend class Object; 2217dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org 221808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org static void MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map); 221908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org static void MigrateFastToSlow(Handle<JSObject> object, 222008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<Map> new_map, 222108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int expected_additional_properties); 222208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 222308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org static void GeneralizeFieldRepresentation(Handle<JSObject> object, 222408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int modify_index, 222508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Representation new_representation, 22269d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org Handle<HeapType> new_field_type); 222708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 2228b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org static void UpdateAllocationSite(Handle<JSObject> object, 2229b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org ElementsKind to_kind); 2230b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2231dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org // Used from Object::GetProperty(). 22328f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithFailedAccessCheck( 22338ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org LookupIterator* it); 22347c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 2235202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetElementWithCallback( 22369e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSObject> object, 22379e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> receiver, 22389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> structure, 22399e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org uint32_t index, 22409e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> holder); 22419e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 2242eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> 2243eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetElementAttributeWithInterceptor(Handle<JSObject> object, 2244eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> receiver, 2245eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org uint32_t index, bool continue_search); 2246eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> 2247eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetElementAttributeWithoutInterceptor(Handle<JSObject> object, 2248eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> receiver, 2249eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org uint32_t index, 2250eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org bool continue_search); 22512ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetElementWithCallback( 2252528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<JSObject> object, 2253528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<Object> structure, 2254f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org uint32_t index, 2255528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<Object> value, 2256528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<JSObject> holder, 2257486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode); 22589e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetElementWithInterceptor( 2259b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<JSObject> object, 22608f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org uint32_t index, 2261b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value, 2262ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org PropertyAttributes attributes, 2263486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode, 2264ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org bool check_prototype, 2265ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org SetPropertyMode set_mode); 22669e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetElementWithoutInterceptor( 2267b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<JSObject> object, 22685d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org uint32_t index, 2269b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value, 2270ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org PropertyAttributes attributes, 2271486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode, 2272ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org bool check_prototype, 2273ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org SetPropertyMode set_mode); 22749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT 22759e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static MaybeHandle<Object> SetElementWithCallbackSetterInPrototypes( 2276b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<JSObject> object, 2277528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org uint32_t index, 2278b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value, 2279528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool* found, 2280486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode); 22819e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetDictionaryElement( 2282b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<JSObject> object, 2283b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 2284b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value, 2285b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org PropertyAttributes attributes, 2286486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode, 2287b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org bool check_prototype, 2288b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org SetPropertyMode set_mode = SET_PROPERTY); 22899e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetFastDoubleElement( 2290b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<JSObject> object, 2291b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 2292b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value, 2293486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode, 2294b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org bool check_prototype = true); 2295303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 22968f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithFailedAccessCheck( 2297474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org LookupIterator* it, Handle<Object> value, StrictMode strict_mode); 2298528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2299528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Add a property to a slow-case object. 2300528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static void AddSlowProperty(Handle<JSObject> object, 2301528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<Name> name, 2302528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<Object> value, 2303528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org PropertyAttributes attributes); 2304c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 23055b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty( 23065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<JSObject> object, 23075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<Name> name, 23085b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org DeleteMode mode); 23098496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyWithInterceptor( 23105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Handle<JSObject> holder, Handle<JSObject> receiver, Handle<Name> name); 2311ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 2312ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org // Deletes the named property in a normalized object. 2313ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static Handle<Object> DeleteNormalizedProperty(Handle<JSObject> object, 2314ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Handle<Name> name, 2315ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DeleteMode mode); 2316303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 23175b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeleteElement( 23185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<JSObject> object, 23195b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org uint32_t index, 23205b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org DeleteMode mode); 23215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeleteElementWithInterceptor( 23225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<JSObject> object, 23235b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org uint32_t index); 232443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23257b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org bool ReferencesObjectFromElements(FixedArray* elements, 23267b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org ElementsKind kind, 23277b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org Object* object); 23287b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 232943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns true if most of the elements backing storage is used. 233043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool HasDenseElements(); 233143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23322c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Gets the current elements capacity and the number of used elements. 23332c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org void GetElementsCapacityAndUsage(int* capacity, int* used); 23342c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 2335ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org static bool CanSetCallback(Handle<JSObject> object, Handle<Name> name); 23368fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org static void SetElementCallback(Handle<JSObject> object, 23378fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org uint32_t index, 23388fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org Handle<Object> structure, 23398fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org PropertyAttributes attributes); 23408fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org static void SetPropertyCallback(Handle<JSObject> object, 23418fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org Handle<Name> name, 23428fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org Handle<Object> structure, 23438fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org PropertyAttributes attributes); 2344c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org static void DefineElementAccessor(Handle<JSObject> object, 2345c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org uint32_t index, 2346c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org Handle<Object> getter, 2347c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org Handle<Object> setter, 2348975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org PropertyAttributes attributes); 2349000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 2350057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Return the hash table backing store or the inline stored identity hash, 2351057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // whatever is found. 2352057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org MUST_USE_RESULT Object* GetHiddenPropertiesHashTable(); 2353057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2354057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Return the hash table backing store for hidden properties. If there is no 2355057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // backing store, allocate one. 2356057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static Handle<ObjectHashTable> GetOrCreateHiddenPropertiesHashtable( 2357057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Handle<JSObject> object); 2358057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2359000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org // Set the hidden property backing store to either a hash table or 2360000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org // the inline-stored identity hash. 2361057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static Handle<Object> SetHiddenPropertiesHashTable( 2362057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Handle<JSObject> object, 2363057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Handle<Object> value); 2364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2365057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org MUST_USE_RESULT Object* GetIdentityHash(); 2366057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 23673c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static Handle<Smi> GetOrCreateIdentityHash(Handle<JSObject> object); 23688fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 236943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); 237043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 237143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 237243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23736d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// Common superclass for FixedArrays that allow implementations to share 23746d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// common accessors and some code paths. 23756d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgclass FixedArrayBase: public HeapObject { 237643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 237743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [length]: length of the array. 23784b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int length() const; 237943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_length(int value); 238043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 238163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org // Get and set the length using acquire loads and release stores. 23824b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int synchronized_length() const; 238363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org inline void synchronized_set_length(int value); 238463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org 2385975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(FixedArrayBase) 23866d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 23876d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Layout description. 23886d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Length is smi tagged when it is stored. 23896d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org static const int kLengthOffset = HeapObject::kHeaderSize; 23906d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org static const int kHeaderSize = kLengthOffset + kPointerSize; 23916d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}; 23926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 23934acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 23949fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.orgclass FixedDoubleArray; 239599aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgclass IncrementalMarking; 239699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 23976d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 23986d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// FixedArray describes fixed-sized arrays with element type Object*. 23996d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgclass FixedArray: public FixedArrayBase { 24006d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org public: 240143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Setter and getter for elements. 240243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Object* get(int index); 24039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<FixedArray> array, int index); 2404a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Setter that uses write barrier. 240543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set(int index, Object* value); 24067c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline bool is_the_hole(int index); 240743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2408b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org // Setter that doesn't need write barrier. 2409a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org inline void set(int index, Smi* value); 2410a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Setter with explicit barrier mode. 24115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org inline void set(int index, Object* value, WriteBarrierMode mode); 24125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 241343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Setters for frequently used oddballs located in old space. 241443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_undefined(int index); 2415236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org inline void set_null(int index); 241643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_the_hole(int index); 241743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 241864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org inline Object** GetFirstElementAddress(); 241964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org inline bool ContainsOnlySmisOrHoles(); 242064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 2421fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org // Gives access to raw memory which stores the array's data. 2422fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org inline Object** data_start(); 2423fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 24242f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org inline void FillWithHoles(int from, int to); 24252f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org 24266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Shrink length and insert filler objects. 24276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Shrink(int length); 24286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 24293484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org // Copy operation. 24309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<FixedArray> CopySize(Handle<FixedArray> array, 24319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org int new_length, 24329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org PretenureFlag pretenure = NOT_TENURED); 243343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 243443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Add the elements of a JSArray to this FixedArray. 24353484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org MUST_USE_RESULT static MaybeHandle<FixedArray> AddKeysFromArrayLike( 2436202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<FixedArray> content, 24373484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<JSObject> array); 243843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24398f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Computes the union of keys and return the result. 24408f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Used for implementing "for (n in object) { }" 2441202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<FixedArray> UnionOfKeys( 2442202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<FixedArray> first, 2443202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<FixedArray> second); 244443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 244543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Copy a sub array from the receiver to dest. 244643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); 244743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 244843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Garbage collection support. 244943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } 245043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // Code Generation support. 24523e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org static int OffsetOfElementAt(int index) { return SizeFor(index); } 24533e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 24544954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Garbage collection support. 24554954674151afa960af66efb4831df06bde727333yangguo@chromium.org Object** RawFieldOfElementAt(int index) { 24564954674151afa960af66efb4831df06bde727333yangguo@chromium.org return HeapObject::RawField(this, OffsetOfElementAt(index)); 24574954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 24584954674151afa960af66efb4831df06bde727333yangguo@chromium.org 2459975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(FixedArray) 246043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24610c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Maximal allowed size, in bytes, of a single FixedArray. 24620c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Prevents overflowing size computations, as well as extreme memory 24630c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // consumption. 2464f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org static const int kMaxSize = 128 * MB * kPointerSize; 24650c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Maximally allowed length of a FixedArray. 24660c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize; 246771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 246843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 2469a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(FixedArray) 2470c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(FixedArray) 247143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 24729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Checks if two FixedArrays have identical contents. 24739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bool IsEqualTo(FixedArray* other); 247443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 247543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 247665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Swap two elements in a pair of arrays. If this array and the 247765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // numbers array are the same object, the elements are only swapped 247865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // once. 247965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org void SwapPairs(FixedArray* numbers, int i, int j); 248043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 248165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Sort prefix of this array and the numbers array as pairs wrt. the 248265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // numbers. If the numbers array and the this array are the same 248365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // object, the prefix of this array is sorted. 248465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org void SortPairs(FixedArray* numbers, uint32_t len); 248543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2486ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org class BodyDescriptor : public FlexibleBodyDescriptor<kHeaderSize> { 2487ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 2488ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline int SizeOf(Map* map, HeapObject* object) { 2489ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return SizeFor(reinterpret_cast<FixedArray*>(object)->length()); 2490ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 2491ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org }; 2492ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 249343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected: 2494b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Set operation on FixedArray without using write barriers. Can 2495b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // only be used for storing old space objects or smis. 2496394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static inline void NoWriteBarrierSet(FixedArray* array, 2497394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int index, 2498394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Object* value); 249943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // Set operation on FixedArray without incremental write barrier. Can 250164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // only be used if the object is guaranteed to be white (whiteness witness 250264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // is present). 250364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org static inline void NoIncrementalWriteBarrierSet(FixedArray* array, 250464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org int index, 250564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Object* value); 250664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 250743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 2508d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kHeaderSize == Internals::kFixedArrayHeaderSize); 2509eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 251043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(FixedArray); 251143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 251243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 251343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25146d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// FixedDoubleArray describes fixed-sized arrays with element type double. 25156d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgclass FixedDoubleArray: public FixedArrayBase { 25166d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org public: 25176d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Setter and getter for elements. 25187c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline double get_scalar(int index); 251988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org inline int64_t get_representation(int index); 25209e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<FixedDoubleArray> array, int index); 25216d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org inline void set(int index, double value); 25226d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org inline void set_the_hole(int index); 25236d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 25246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Checking for the hole. 25256d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org inline bool is_the_hole(int index); 25266d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 25276d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Garbage collection support. 25286d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org inline static int SizeFor(int length) { 25296d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return kHeaderSize + length * kDoubleSize; 25306d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 25316d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 2532fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org // Gives access to raw memory which stores the array's data. 2533fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org inline double* data_start(); 2534fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 25352f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org inline void FillWithHoles(int from, int to); 25362f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org 2537717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // Code Generation support. 2538717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org static int OffsetOfElementAt(int index) { return SizeFor(index); } 2539717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 254084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org inline static bool is_the_hole_nan(double value); 254184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org inline static double hole_nan_as_double(); 254284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org inline static double canonical_not_the_hole_nan_as_double(); 25436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 2544975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(FixedDoubleArray) 25456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 25466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Maximal allowed size, in bytes, of a single FixedDoubleArray. 25476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Prevents overflowing size computations, as well as extreme memory 25486d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // consumption. 25496d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org static const int kMaxSize = 512 * MB; 25506d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Maximally allowed length of a FixedArray. 25516d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize; 25526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 25536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Dispatched behavior. 2554a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(FixedDoubleArray) 2555c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(FixedDoubleArray) 25566d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 25576d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org private: 25586d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray); 25596d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}; 25606d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 25616d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 2562a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org// ConstantPoolArray describes a fixed-sized array containing constant pool 2563196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// entries. 2564196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// 2565196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// A ConstantPoolArray can be structured in two different ways depending upon 2566196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// whether it is extended or small. The is_extended_layout() method can be used 2567196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// to discover which layout the constant pool has. 2568196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// 2569196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// The format of a small constant pool is: 2570196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [kSmallLayout1Offset] : Small section layout bitmap 1 2571196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [kSmallLayout2Offset] : Small section layout bitmap 2 2572196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(INT64, SMALL_SECTION)] : 64 bit entries 2573196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2574196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(CODE_PTR, SMALL_SECTION)] : code pointer entries 2575196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2576196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(HEAP_PTR, SMALL_SECTION)] : heap pointer entries 2577196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2578196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(INT32, SMALL_SECTION)] : 32 bit entries 2579196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2580196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// 2581196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// If the constant pool has an extended layout, the extended section constant 2582196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// pool also contains an extended section, which has the following format at 2583196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// location get_extended_section_header_offset(): 2584196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [kExtendedInt64CountOffset] : count of extended 64 bit entries 2585196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [kExtendedCodePtrCountOffset] : count of extended code pointers 2586196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [kExtendedHeapPtrCountOffset] : count of extended heap pointers 2587196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [kExtendedInt32CountOffset] : count of extended 32 bit entries 2588196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(INT64, EXTENDED_SECTION)] : 64 bit entries 2589196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2590196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(CODE_PTR, EXTENDED_SECTION)]: code pointer entries 2591196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2592196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(HEAP_PTR, EXTENDED_SECTION)]: heap pointer entries 2593196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2594196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// [first_index(INT32, EXTENDED_SECTION)] : 32 bit entries 2595196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// ... : ... 2596196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// 2597196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgclass ConstantPoolArray: public HeapObject { 2598a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org public: 25999e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org enum WeakObjectState { 26009e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org NO_WEAK_OBJECTS, 26012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org WEAK_OBJECTS_IN_OPTIMIZED_CODE, 26022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org WEAK_OBJECTS_IN_IC 26039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org }; 26049e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 2605196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org enum Type { 2606196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org INT64 = 0, 2607196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org CODE_PTR, 2608196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org HEAP_PTR, 2609196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org INT32, 2610196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Number of types stored by the ConstantPoolArrays. 2611196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org NUMBER_OF_TYPES, 2612196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org FIRST_TYPE = INT64, 2613196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org LAST_TYPE = INT32 2614196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org }; 2615196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2616196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org enum LayoutSection { 2617196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org SMALL_SECTION = 0, 261812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org EXTENDED_SECTION, 261912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org NUMBER_OF_LAYOUT_SECTIONS 2620196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org }; 2621196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2622196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class NumberOfEntries BASE_EMBEDDED { 2623196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org public: 2624d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline NumberOfEntries() { 2625d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org for (int i = 0; i < NUMBER_OF_TYPES; i++) { 2626d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org element_counts_[i] = 0; 2627d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 2628d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 2629d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 2630196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline NumberOfEntries(int int64_count, int code_ptr_count, 2631196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org int heap_ptr_count, int int32_count) { 2632196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[INT64] = int64_count; 2633196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[CODE_PTR] = code_ptr_count; 2634196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[HEAP_PTR] = heap_ptr_count; 2635196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[INT32] = int32_count; 2636196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 2637196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2638196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline NumberOfEntries(ConstantPoolArray* array, LayoutSection section) { 2639196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[INT64] = array->number_of_entries(INT64, section); 2640196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[CODE_PTR] = array->number_of_entries(CODE_PTR, section); 2641196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[HEAP_PTR] = array->number_of_entries(HEAP_PTR, section); 2642196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org element_counts_[INT32] = array->number_of_entries(INT32, section); 2643196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 2644196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2645d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline void increment(Type type); 2646d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline int equals(const NumberOfEntries& other) const; 2647d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline bool is_empty() const; 2648d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline int count_of(Type type) const; 2649d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline int base_of(Type type) const; 2650d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline int total_count() const; 2651d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline int are_in_range(int min, int max) const; 2652196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2653196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org private: 2654196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org int element_counts_[NUMBER_OF_TYPES]; 2655196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org }; 2656196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2657196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class Iterator BASE_EMBEDDED { 2658196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org public: 2659196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline Iterator(ConstantPoolArray* array, Type type) 2660d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org : array_(array), 2661d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org type_(type), 2662d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org final_section_(array->final_section()), 2663d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org current_section_(SMALL_SECTION), 2664d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org next_index_(array->first_index(type, SMALL_SECTION)) { 2665d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org update_section(); 2666d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 2667d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 2668d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline Iterator(ConstantPoolArray* array, Type type, LayoutSection section) 2669d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org : array_(array), 2670d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org type_(type), 2671d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org final_section_(section), 2672d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org current_section_(section), 2673d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org next_index_(array->first_index(type, section)) { 2674196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org update_section(); 2675196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 2676196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2677196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int next_index(); 2678196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline bool is_finished(); 2679d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 2680196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org private: 2681196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline void update_section(); 2682196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org ConstantPoolArray* array_; 2683196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org const Type type_; 2684196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org const LayoutSection final_section_; 2685196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2686196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org LayoutSection current_section_; 2687196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org int next_index_; 2688196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org }; 2689196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2690196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Getters for the first index, the last index and the count of entries of 2691196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // a given type for a given layout section. 2692196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int first_index(Type type, LayoutSection layout_section); 2693196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int last_index(Type type, LayoutSection layout_section); 2694196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int number_of_entries(Type type, LayoutSection layout_section); 2695a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2696196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Returns the type of the entry at the given index. 2697196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline Type get_type(int index); 269812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inline bool offset_is_type(int offset, Type type); 2699a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2700a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Setter and getter for pool elements. 2701bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org inline Address get_code_ptr_entry(int index); 2702bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org inline Object* get_heap_ptr_entry(int index); 2703a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline int64_t get_int64_entry(int index); 2704a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline int32_t get_int32_entry(int index); 2705a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline double get_int64_entry_as_double(int index); 2706a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2707bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org inline void set(int index, Address value); 2708a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline void set(int index, Object* value); 2709a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline void set(int index, int64_t value); 2710a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline void set(int index, double value); 2711a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline void set(int index, int32_t value); 2712a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 271312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Setters which take a raw offset rather than an index (for code generation). 271412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inline void set_at_offset(int offset, int32_t value); 271512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inline void set_at_offset(int offset, int64_t value); 271612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inline void set_at_offset(int offset, double value); 271712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inline void set_at_offset(int offset, Address value); 271812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inline void set_at_offset(int offset, Object* value); 271912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 2720196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Setter and getter for weak objects state 2721196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline void set_weak_object_state(WeakObjectState state); 2722196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline WeakObjectState get_weak_object_state(); 2723196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2724196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Returns true if the constant pool has an extended layout, false if it has 2725196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // only the small layout. 2726196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline bool is_extended_layout(); 2727196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2728196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Returns the last LayoutSection in this constant pool array. 2729196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline LayoutSection final_section(); 2730196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2731196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Set up initial state for a small layout constant pool array. 2732196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline void Init(const NumberOfEntries& small); 2733196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2734196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Set up initial state for an extended layout constant pool array. 2735196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline void InitExtended(const NumberOfEntries& small, 2736196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org const NumberOfEntries& extended); 2737196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2738196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Clears the pointer entries with GC safe values. 2739196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org void ClearPtrEntries(Isolate* isolate); 2740196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2741196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // returns the total number of entries in the constant pool array. 2742196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int length(); 2743a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2744a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Garbage collection support. 2745196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int size(); 2746196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2747d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 2748d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline static int MaxInt64Offset(int number_of_int64) { 2749d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return kFirstEntryOffset + (number_of_int64 * kInt64Size); 2750d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 2751d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 2752196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline static int SizeFor(const NumberOfEntries& small) { 2753196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org int size = kFirstEntryOffset + 2754196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (small.count_of(INT64) * kInt64Size) + 2755196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (small.count_of(CODE_PTR) * kPointerSize) + 2756196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (small.count_of(HEAP_PTR) * kPointerSize) + 2757196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (small.count_of(INT32) * kInt32Size); 2758196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return RoundUp(size, kPointerSize); 2759196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 2760196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2761196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline static int SizeForExtended(const NumberOfEntries& small, 2762196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org const NumberOfEntries& extended) { 2763196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org int size = SizeFor(small); 2764196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org size = RoundUp(size, kInt64Size); // Align extended header to 64 bits. 2765196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org size += kExtendedFirstOffset + 2766196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (extended.count_of(INT64) * kInt64Size) + 2767196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (extended.count_of(CODE_PTR) * kPointerSize) + 2768196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (extended.count_of(HEAP_PTR) * kPointerSize) + 2769196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org (extended.count_of(INT32) * kInt32Size); 2770196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return RoundUp(size, kPointerSize); 2771196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 2772196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2773196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline static int entry_size(Type type) { 2774196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org switch (type) { 2775196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org case INT32: 2776196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return kInt32Size; 2777196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org case INT64: 2778196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return kInt64Size; 2779196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org case CODE_PTR: 2780196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org case HEAP_PTR: 2781196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return kPointerSize; 2782196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org default: 2783196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org UNREACHABLE(); 2784196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return 0; 2785196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 2786a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 2787a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2788a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Code Generation support. 2789a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org inline int OffsetOfElementAt(int index) { 2790196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org int offset; 2791196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org LayoutSection section; 2792196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org if (is_extended_layout() && index >= first_extended_section_index()) { 2793196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org section = EXTENDED_SECTION; 2794196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org offset = get_extended_section_header_offset() + kExtendedFirstOffset; 2795a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } else { 2796196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org section = SMALL_SECTION; 2797196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org offset = kFirstEntryOffset; 2798196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 2799196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2800196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Add offsets for the preceding type sections. 2801e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(index <= last_index(LAST_TYPE, section)); 2802196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org for (Type type = FIRST_TYPE; index > last_index(type, section); 2803196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org type = next_type(type)) { 2804196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org offset += entry_size(type) * number_of_entries(type, section); 2805a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 2806196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2807196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Add offset for the index in it's type. 2808196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Type type = get_type(index); 2809196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org offset += entry_size(type) * (index - first_index(type, section)); 2810196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return offset; 2811a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 2812a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2813975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ConstantPoolArray) 2814a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2815bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org // Garbage collection support. 2816bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org Object** RawFieldOfElementAt(int index) { 2817bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return HeapObject::RawField(this, OffsetOfElementAt(index)); 2818bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 2819bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 2820196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Small Layout description. 2821196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kSmallLayout1Offset = HeapObject::kHeaderSize; 2822196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kSmallLayout2Offset = kSmallLayout1Offset + kInt32Size; 2823196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kHeaderSize = kSmallLayout2Offset + kInt32Size; 2824196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kFirstEntryOffset = ROUND_UP(kHeaderSize, kInt64Size); 2825196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2826196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kSmallLayoutCountBits = 10; 2827196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kMaxSmallEntriesPerType = (1 << kSmallLayoutCountBits) - 1; 2828196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2829196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Fields in kSmallLayout1Offset. 2830196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class Int64CountField: public BitField<int, 1, kSmallLayoutCountBits> {}; 2831196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class CodePtrCountField: public BitField<int, 11, kSmallLayoutCountBits> {}; 2832196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class HeapPtrCountField: public BitField<int, 21, kSmallLayoutCountBits> {}; 2833196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class IsExtendedField: public BitField<bool, 31, 1> {}; 2834196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2835196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Fields in kSmallLayout2Offset. 2836196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class Int32CountField: public BitField<int, 1, kSmallLayoutCountBits> {}; 2837196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class TotalCountField: public BitField<int, 11, 12> {}; 2838196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class WeakObjectStateField: public BitField<WeakObjectState, 23, 2> {}; 2839196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2840196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Extended layout description, which starts at 2841196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // get_extended_section_header_offset(). 2842196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kExtendedInt64CountOffset = 0; 2843196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kExtendedCodePtrCountOffset = 2844196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kExtendedInt64CountOffset + kPointerSize; 2845196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kExtendedHeapPtrCountOffset = 2846196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kExtendedCodePtrCountOffset + kPointerSize; 2847196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kExtendedInt32CountOffset = 2848196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kExtendedHeapPtrCountOffset + kPointerSize; 2849196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static const int kExtendedFirstOffset = 2850196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kExtendedInt32CountOffset + kPointerSize; 2851a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2852a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Dispatched behavior. 2853a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org void ConstantPoolIterateBody(ObjectVisitor* v); 2854a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2855a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org DECLARE_PRINTER(ConstantPoolArray) 2856a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org DECLARE_VERIFIER(ConstantPoolArray) 2857a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2858a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org private: 2859196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int first_extended_section_index(); 2860196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline int get_extended_section_header_offset(); 2861196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 2862196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline static Type next_type(Type type) { 2863e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type >= FIRST_TYPE && type < NUMBER_OF_TYPES); 2864196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org int type_int = static_cast<int>(type); 2865196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return static_cast<Type>(++type_int); 2866a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 2867a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2868a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ConstantPoolArray); 2869a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}; 2870a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2871a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 287243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DescriptorArrays are fixed arrays used to hold instance descriptors. 287343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The format of the these objects is: 287489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org// [0]: Number of descriptors 287589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org// [1]: Either Smi(0) if uninitialized, or a pointer to small fixed array: 2876de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org// [0]: pointer to fixed array with enum cache 2877de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org// [1]: either Smi(0) or pointer to fixed array with indices 287889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org// [2]: first key 287989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org// [2 + number of descriptors * kDescriptorSize]: start of slack 288043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass DescriptorArray: public FixedArray { 288143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 288240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org // Returns true for both shared empty_descriptor_array and for smis, which the 288340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org // map uses to encode additional bit fields when the descriptor array is not 288440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org // yet used. 28859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com inline bool IsEmpty(); 2886846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org 288743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of descriptors in the array. 288843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int number_of_descriptors() { 2889e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length() >= kFirstIndex || IsEmpty()); 2890ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int len = length(); 289133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return len == 0 ? 0 : Smi::cast(get(kDescriptorLengthIndex))->value(); 289256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 289356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 289433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org int number_of_descriptors_storage() { 289533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org int len = length(); 289633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return len == 0 ? 0 : (len - kFirstIndex) / kDescriptorSize; 289733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 289833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 289933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org int NumberOfSlackDescriptors() { 290033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return number_of_descriptors_storage() - number_of_descriptors(); 290133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 290233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 290333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org inline void SetNumberOfDescriptors(int number_of_descriptors); 290499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org inline int number_of_entries() { return number_of_descriptors(); } 290599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 290643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool HasEnumCache() { 2907304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org return !IsEmpty() && !get(kEnumCacheIndex)->IsSmi(); 290843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 290943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 291006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org void CopyEnumCacheFrom(DescriptorArray* array) { 291106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org set(kEnumCacheIndex, array->get(kEnumCacheIndex)); 291206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org } 291306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 291433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org FixedArray* GetEnumCache() { 2915e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(HasEnumCache()); 2916304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex)); 291733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return FixedArray::cast(bridge->get(kEnumCacheBridgeCacheIndex)); 291833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 291933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 292033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org bool HasEnumIndicesCache() { 292133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (IsEmpty()) return false; 292233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Object* object = get(kEnumCacheIndex); 292333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (object->IsSmi()) return false; 292433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org FixedArray* bridge = FixedArray::cast(object); 292533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return !bridge->get(kEnumCacheBridgeIndicesCacheIndex)->IsSmi(); 292633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 292733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 292833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org FixedArray* GetEnumIndicesCache() { 2929e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(HasEnumIndicesCache()); 293033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex)); 293133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return FixedArray::cast(bridge->get(kEnumCacheBridgeIndicesCacheIndex)); 293243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 293343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2934400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org Object** GetEnumCacheSlot() { 2935e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(HasEnumCache()); 2936400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org return HeapObject::RawField(reinterpret_cast<HeapObject*>(this), 2937304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org kEnumCacheOffset); 2938400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org } 2939400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org 294006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org void ClearEnumCache(); 294106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 294243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize or change the enum cache, 294343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // using the supplied storage for the small "bridge". 2944be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org void SetEnumCache(FixedArray* bridge_storage, 2945be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org FixedArray* new_cache, 2946be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org Object* new_index_cache); 294743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2948474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org bool CanHoldValue(int descriptor, Object* value); 2949474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 2950defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // Accessors for fetching instance descriptor at descriptor number. 2951750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline Name* GetKey(int descriptor_number); 2952400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org inline Object** GetKeySlot(int descriptor_number); 295343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Object* GetValue(int descriptor_number); 2954e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org inline void SetValue(int descriptor_number, Object* value); 295537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org inline Object** GetValueSlot(int descriptor_number); 29569d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org static inline int GetValueOffset(int descriptor_number); 2957e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org inline Object** GetDescriptorStartSlot(int descriptor_number); 2958e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org inline Object** GetDescriptorEndSlot(int descriptor_number); 2959ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com inline PropertyDetails GetDetails(int descriptor_number); 2960defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org inline PropertyType GetType(int descriptor_number); 2961defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org inline int GetFieldIndex(int descriptor_number); 2962e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org inline HeapType* GetFieldType(int descriptor_number); 2963fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org inline Object* GetConstant(int descriptor_number); 2964defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org inline Object* GetCallbacksObject(int descriptor_number); 2965defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org inline AccessorDescriptor* GetCallbacks(int descriptor_number); 2966394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 2967750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline Name* GetSortedKey(int descriptor_number); 296846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline int GetSortedKeyIndex(int descriptor_number); 296946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline void SetSortedKey(int pointer, int descriptor_number); 2970f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org inline void SetRepresentation(int descriptor_number, 2971f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation representation); 297246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 297343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Accessor for complete descriptor. 297443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void Get(int descriptor_number, Descriptor* desc); 29752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline void Set(int descriptor_number, Descriptor* desc); 2976202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void Replace(int descriptor_number, Descriptor* descriptor); 297746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 297828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // Append automatically sets the enumeration index. This should only be used 297928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // to add descriptors in bulk at the end, followed by sorting the descriptor 298028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // array. 298133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org inline void Append(Descriptor* desc); 298243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29835b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org static Handle<DescriptorArray> CopyUpTo(Handle<DescriptorArray> desc, 2984202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org int enumeration_index, 2985202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org int slack = 0); 2986a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 2987528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static Handle<DescriptorArray> CopyUpToAddAttributes( 2988528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<DescriptorArray> desc, 2989528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int enumeration_index, 2990202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org PropertyAttributes attributes, 2991202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org int slack = 0); 299206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 299343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Sort the instance descriptors by the hash codes of their keys. 299446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org void Sort(); 299543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 299643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Search the instance descriptors for given name. 2997750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org INLINE(int Search(Name* name, int number_of_own_descriptors)); 299843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2999ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // As the above, but uses DescriptorLookupCache and updates it when 3000ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // necessary. 3001750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org INLINE(int SearchWithCache(Name* name, Map* map)); 300243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Allocates a DescriptorArray, but returns the singleton 30049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // empty descriptor array object if number_of_descriptors is 0. 30052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static Handle<DescriptorArray> Allocate(Isolate* isolate, 30062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org int number_of_descriptors, 30072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org int slack = 0); 300843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3009975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(DescriptorArray) 301043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 301143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Constant for denoting key was not found. 301243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kNotFound = -1; 301343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 301433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static const int kDescriptorLengthIndex = 0; 301533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static const int kEnumCacheIndex = 1; 301633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static const int kFirstIndex = 2; 301743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 301843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The length of the "bridge" to the enum cache. 3019304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static const int kEnumCacheBridgeLength = 2; 3020304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static const int kEnumCacheBridgeCacheIndex = 0; 3021304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static const int kEnumCacheBridgeIndicesCacheIndex = 1; 302243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 302343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 302433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static const int kDescriptorLengthOffset = FixedArray::kHeaderSize; 302533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static const int kEnumCacheOffset = kDescriptorLengthOffset + kPointerSize; 3026de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org static const int kFirstOffset = kEnumCacheOffset + kPointerSize; 302743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 302843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description for the bridge array. 3029304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static const int kEnumCacheBridgeCacheOffset = FixedArray::kHeaderSize; 303043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3031400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org // Layout of descriptor. 3032400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org static const int kDescriptorKey = 0; 3033400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org static const int kDescriptorDetails = 1; 3034400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org static const int kDescriptorValue = 2; 3035400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org static const int kDescriptorSize = 3; 3036400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org 3037023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#ifdef OBJECT_PRINT 303843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Print all the descriptors. 3039f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void PrintDescriptors(OStream& os); // NOLINT 3040023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#endif 3041769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com 3042023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#ifdef DEBUG 3043769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com // Is the descriptor array sorted and without duplicates? 304406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org bool IsSortedNoDuplicates(int valid_descriptors = -1); 30459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3046212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // Is the descriptor array consistent with the back pointers in targets? 3047212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org bool IsConsistentWithBackPointers(Map* current_map); 3048212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org 30499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Are two DescriptorArrays equal? 30509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bool IsEqualTo(DescriptorArray* other); 305143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 305243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3053b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org // Returns the fixed array length required to hold number_of_descriptors 3054b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org // descriptors. 3055b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org static int LengthFor(int number_of_descriptors) { 3056129d398d682e6ca3910808c913212ce532f1e155danno@chromium.org return ToKeyIndex(number_of_descriptors); 3057129d398d682e6ca3910808c913212ce532f1e155danno@chromium.org } 3058129d398d682e6ca3910808c913212ce532f1e155danno@chromium.org 305943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 30602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // WhitenessWitness is used to prove that a descriptor array is white 30612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // (unmarked), so incremental write barriers can be skipped because the 30622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // marking invariant cannot be broken and slots pointing into evacuation 30632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // candidates will be discovered when the object is scanned. A witness is 30642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // always stack-allocated right after creating an array. By allocating a 30652ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // witness, incremental marking is globally disabled. The witness is then 30662ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // passed along wherever needed to statically prove that the array is known to 30672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // be white. 30682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org class WhitenessWitness { 30692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org public: 30702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline explicit WhitenessWitness(DescriptorArray* array); 30712ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline ~WhitenessWitness(); 30722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 30732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org private: 30742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org IncrementalMarking* marking_; 30752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org }; 30762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 30779a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // An entry in a DescriptorArray, represented as an (array, index) pair. 30789a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org class Entry { 30799a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org public: 30809a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org inline explicit Entry(DescriptorArray* descs, int index) : 30819a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org descs_(descs), index_(index) { } 30829a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 30839a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org inline PropertyType type() { return descs_->GetType(index_); } 30849a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org inline Object* GetCallbackObject() { return descs_->GetValue(index_); } 30859a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 30869a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org private: 30879a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org DescriptorArray* descs_; 30889a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org int index_; 30899a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org }; 30909a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 309143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Conversion from descriptor number to array indices. 309243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int ToKeyIndex(int descriptor_number) { 3093400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org return kFirstIndex + 3094400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org (descriptor_number * kDescriptorSize) + 3095400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org kDescriptorKey; 309643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 3097846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org 3098846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org static int ToDetailsIndex(int descriptor_number) { 3099400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org return kFirstIndex + 3100400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org (descriptor_number * kDescriptorSize) + 3101400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org kDescriptorDetails; 3102846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org } 3103846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org 310443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int ToValueIndex(int descriptor_number) { 3105400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org return kFirstIndex + 3106400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org (descriptor_number * kDescriptorSize) + 3107400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org kDescriptorValue; 310843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 310943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3110202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Transfer a complete descriptor from the src descriptor array to this 3111202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // descriptor array. 3112202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void CopyFrom(int index, 3113202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org DescriptorArray* src, 3114202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org const WhitenessWitness&); 3115202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 31162ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline void Set(int descriptor_number, 31172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Descriptor* desc, 31182ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org const WhitenessWitness&); 31192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 312099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org // Swap first and second descriptor. 312106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org inline void SwapSortedKeys(int first, int second); 312243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 312343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(DescriptorArray); 312443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 312543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 312643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 312706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgenum SearchMode { ALL_ENTRIES, VALID_ENTRIES }; 312806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 312906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgtemplate<SearchMode search_mode, typename T> 3130750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orginline int LinearSearch(T* array, Name* name, int len, int valid_entries); 313199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 313299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 313306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgtemplate<SearchMode search_mode, typename T> 3134750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orginline int Search(T* array, Name* name, int valid_entries = 0); 313599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 313699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 313743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HashTable is a subclass of FixedArray that implements a hash table 313843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// that uses open addressing and quadratic probing. 313943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 314043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// In order for the quadratic probing to work, elements that have not 314143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// yet been used and elements that have been deleted are 314243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// distinguished. Probing continues when deleted elements are 314343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// encountered and stops when unused elements are encountered. 314443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 314543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Elements with key == undefined have not been used yet. 3146c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// - Elements with key == the_hole have been deleted. 314743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 314886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// The hash table class is parameterized with a Shape and a Key. 314986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// Shape must be a class with the following interface: 315086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// class ExampleShape { 315186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// public: 315286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// // Tells whether key matches other. 315386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// static bool IsMatch(Key key, Object* other); 315486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// // Returns the hash value for key. 315586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// static uint32_t Hash(Key key); 315686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// // Returns the hash value for object. 315786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// static uint32_t HashForObject(Key key, Object* object); 315886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// // Convert key to an object. 3159865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// static inline Handle<Object> AsHandle(Isolate* isolate, Key key); 316086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// // The prefix size indicates number of elements in the beginning 316186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// // of the backing storage. 316286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// static const int kPrefixSize = ..; 316386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// // The Element size indicates number of elements per entry. 316486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// static const int kEntrySize = ..; 316586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// }; 31669d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// The prefix size indicates an amount of memory in the 316743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// beginning of the backing storage that can be used for non-element 316843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// information by subclasses. 31699258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 3170f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comtemplate<typename Key> 3171f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass BaseShape { 3172f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public: 3173f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const bool UsesSeed = false; 3174f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static uint32_t Hash(Key key) { return 0; } 3175f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static uint32_t SeededHash(Key key, uint32_t seed) { 3176e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(UsesSeed); 3177f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return Hash(key); 3178f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 3179f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static uint32_t HashForObject(Key key, Object* object) { return 0; } 3180f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static uint32_t SeededHashForObject(Key key, uint32_t seed, Object* object) { 3181e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(UsesSeed); 3182f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return HashForObject(key, object); 3183f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 3184f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}; 3185f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3186c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate<typename Derived, typename Shape, typename Key> 318743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass HashTable: public FixedArray { 318843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 3189f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Wrapper methods 3190f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com inline uint32_t Hash(Key key) { 3191f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (Shape::UsesSeed) { 3192865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org return Shape::SeededHash(key, GetHeap()->HashSeed()); 3193f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } else { 3194f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return Shape::Hash(key); 3195f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 3196f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 3197f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3198f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com inline uint32_t HashForObject(Key key, Object* object) { 3199f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (Shape::UsesSeed) { 3200865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org return Shape::SeededHashForObject(key, GetHeap()->HashSeed(), object); 3201f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } else { 3202f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return Shape::HashForObject(key, object); 3203f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 3204f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 3205f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 32069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Returns the number of elements in the hash table. 320743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int NumberOfElements() { 320843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Smi::cast(get(kNumberOfElementsIndex))->value(); 320943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 321043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3211edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org // Returns the number of deleted elements in the hash table. 3212edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org int NumberOfDeletedElements() { 3213edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org return Smi::cast(get(kNumberOfDeletedElementsIndex))->value(); 3214edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org } 3215edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org 32169d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Returns the capacity of the hash table. 321743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int Capacity() { 321843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Smi::cast(get(kCapacityIndex))->value(); 321943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 322043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 322143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // ElementAdded should be called whenever an element is added to a 32229d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // hash table. 322343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void ElementAdded() { SetNumberOfElements(NumberOfElements() + 1); } 322443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 322543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // ElementRemoved should be called whenever an element is removed from 32269d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // a hash table. 3227edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org void ElementRemoved() { 3228edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org SetNumberOfElements(NumberOfElements() - 1); 3229edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); 3230edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org } 3231edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org void ElementsRemoved(int n) { 3232edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org SetNumberOfElements(NumberOfElements() - n); 3233edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org SetNumberOfDeletedElements(NumberOfDeletedElements() + n); 3234edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org } 323543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3236c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Returns a new HashTable object. 3237865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org MUST_USE_RESULT static Handle<Derived> New( 3238c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Isolate* isolate, 3239c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int at_least_space_for, 3240c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, 3241c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org PretenureFlag pretenure = NOT_TENURED); 3242c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 32432c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Computes the required capacity for a table holding the given 32442c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // number of elements. May be more than HashTable::kMaxCapacity. 32452c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org static int ComputeCapacity(int at_least_space_for); 32462c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 324743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the key at entry. 324843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } 324943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3250c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Tells whether k is a real key. The hole and undefined are not allowed 325143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // as keys and can be used to indicate missing or deleted elements. 325243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsKey(Object* k) { 3253c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return !k->IsTheHole() && !k->IsUndefined(); 325443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 325543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 325643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Garbage collection support. 325743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void IteratePrefix(ObjectVisitor* visitor); 325843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void IterateElements(ObjectVisitor* visitor); 325943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3260975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(HashTable) 326143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 326243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Compute the probe offset (quadratic probing). 326343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INLINE(static uint32_t GetProbeOffset(uint32_t n)) { 326443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return (n + n * n) >> 1; 326543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 326643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 326743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kNumberOfElementsIndex = 0; 3268edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org static const int kNumberOfDeletedElementsIndex = 1; 3269edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org static const int kCapacityIndex = 2; 3270edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org static const int kPrefixStartIndex = 3; 3271edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org static const int kElementsStartIndex = 327286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org kPrefixStartIndex + Shape::kPrefixSize; 3273edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org static const int kEntrySize = Shape::kEntrySize; 3274edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org static const int kElementsStartOffset = 327543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kHeaderSize + kElementsStartIndex * kPointerSize; 3276ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kCapacityOffset = 3277ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org kHeaderSize + kCapacityIndex * kPointerSize; 327843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32792abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // Constant used for denoting a absent entry. 32802abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org static const int kNotFound = -1; 32812abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 32820c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Maximal capacity of HashTable. Based on maximal length of underlying 32830c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // FixedArray. Staying below kMaxCapacity also ensures that EntryToIndex 32840c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // cannot overflow. 32850c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org static const int kMaxCapacity = 32860c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org (FixedArray::kMaxLength - kElementsStartOffset) / kEntrySize; 32870c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 32884980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org // Find entry for key otherwise return kNotFound. 3289ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline int FindEntry(Key key); 3290ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int FindEntry(Isolate* isolate, Key key); 329186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 32924a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Rehashes the table in-place. 32934a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org void Rehash(Key key); 32944a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 329586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org protected: 3296057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org friend class ObjectHashTable; 3297057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 329843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Find the entry at which to insert element with the given key that 329943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // has the given hash value. 330086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org uint32_t FindInsertionEntry(uint32_t hash); 330143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 330243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the index for an entry (of the key) 330343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline int EntryToIndex(int entry) { 330486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return (entry * kEntrySize) + kElementsStartIndex; 330543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 330643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 33079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Update the number of elements in the hash table. 330843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetNumberOfElements(int nof) { 3309394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com set(kNumberOfElementsIndex, Smi::FromInt(nof)); 331043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 331143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3312edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org // Update the number of deleted elements in the hash table. 3313edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org void SetNumberOfDeletedElements(int nod) { 3314394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com set(kNumberOfDeletedElementsIndex, Smi::FromInt(nod)); 3315edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org } 3316edf0cd1f0a597ded80ff7c8ab0e5ffdbcb7a5391kasperl@chromium.org 331743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Sets the capacity of the hash table. 331843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetCapacity(int capacity) { 331943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // To scale a computed hash code to fit within the hash table, we 332043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // use bit-wise AND with a mask, so the capacity must be positive 332143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // and non-zero. 3322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(capacity > 0); 3323e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(capacity <= kMaxCapacity); 3324394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com set(kCapacityIndex, Smi::FromInt(capacity)); 332543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 332643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 332743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 332843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns probe entry. 332943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static uint32_t GetProbe(uint32_t hash, uint32_t number, uint32_t size) { 333021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org DCHECK(base::bits::IsPowerOfTwo32(size)); 333143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return (hash + GetProbeOffset(number)) & (size - 1); 333243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 333343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 333433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org inline static uint32_t FirstProbe(uint32_t hash, uint32_t size) { 33350c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return hash & (size - 1); 33360c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 33370c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 333833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org inline static uint32_t NextProbe( 333933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org uint32_t last, uint32_t number, uint32_t size) { 33400c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return (last + number) & (size - 1); 33410c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 33420c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 3343865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org // Attempt to shrink hash table after removal of key. 3344865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org MUST_USE_RESULT static Handle<Derived> Shrink(Handle<Derived> table, Key key); 3345865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 3346865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org // Ensure enough space for n additional elements. 3347865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org MUST_USE_RESULT static Handle<Derived> EnsureCapacity( 3348865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Derived> table, 3349865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org int n, 3350865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Key key, 3351865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org PretenureFlag pretenure = NOT_TENURED); 3352865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 3353865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org private: 33544a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Returns _expected_ if one of entries given by the first _probe_ probes is 33554a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // equal to _expected_. Otherwise, returns the entry given by the probe 33564a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // number _probe_. 33574a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected); 33584a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 33594a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode); 33604a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 336104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org // Rehashes this hash-table into the new table. 3362865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org void Rehash(Handle<Derived> new_table, Key key); 336386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 336486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 336586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 336686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// HashTableKey is an abstract superclass for virtual key behavior. 336786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.orgclass HashTableKey { 336886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 336986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Returns whether the other object matches this key. 337086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org virtual bool IsMatch(Object* other) = 0; 337186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Returns the hash value for this key. 337286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org virtual uint32_t Hash() = 0; 337386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Returns the hash value for object. 337486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org virtual uint32_t HashForObject(Object* key) = 0; 33759d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Returns the key object for storing into the hash table. 3376865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org MUST_USE_RESULT virtual Handle<Object> AsHandle(Isolate* isolate) = 0; 337786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Required. 337886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org virtual ~HashTableKey() {} 337943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 338043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3381f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 33824a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgclass StringTableShape : public BaseShape<HashTableKey*> { 338386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 3384ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline bool IsMatch(HashTableKey* key, Object* value) { 338586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->IsMatch(value); 338686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 3387865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 3388ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline uint32_t Hash(HashTableKey* key) { 338986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->Hash(); 339086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 3391865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 3392ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 339386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->HashForObject(object); 339486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 3395865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 3396865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 339786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 339886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kPrefixSize = 0; 339986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kEntrySize = 1; 340086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 340143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3402fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgclass SeqOneByteString; 340340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 34044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// StringTable. 340543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 340643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// No special elements in the prefix and the element size is 1 34074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// because only the string itself (the key) needs to be stored. 3408c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass StringTable: public HashTable<StringTable, 3409c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org StringTableShape, 3410c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org HashTableKey*> { 341143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 3412b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org // Find string in the string table. If it is not there yet, it is 3413b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org // added. The return value is the string found. 3414b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org static Handle<String> LookupString(Isolate* isolate, Handle<String> key); 3415b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org static Handle<String> LookupKey(Isolate* isolate, HashTableKey* key); 341643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3417a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // Tries to internalize given string and returns string handle on success 3418a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // or an empty handle otherwise. 3419a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<String> InternalizeStringIfExists( 3420a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org Isolate* isolate, 3421a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org Handle<String> string); 3422a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 34234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Looks up a string that is equal to the given string and returns 3424a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // string handle if it is found, or an empty handle otherwise. 3425a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<String> LookupStringIfExists( 3426a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org Isolate* isolate, 3427a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org Handle<String> str); 3428a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<String> LookupTwoCharsStringIfExists( 3429a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org Isolate* isolate, 3430a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org uint16_t c1, 3431a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org uint16_t c2); 34327c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 3433975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(StringTable) 343443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 343543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 34362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org template <bool seq_one_byte> 34372c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org friend class JsonParser; 343833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 34394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(StringTable); 344043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 344143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 344243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3443f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass MapCacheShape : public BaseShape<HashTableKey*> { 344486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 3445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline bool IsMatch(HashTableKey* key, Object* value) { 344686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->IsMatch(value); 344786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 3448865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 3449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline uint32_t Hash(HashTableKey* key) { 345086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->Hash(); 345186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 345286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 3453ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 345486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->HashForObject(object); 345586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 345686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 3457865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 345886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 345986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kPrefixSize = 0; 346086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kEntrySize = 2; 346186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 346286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 346386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 3464236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org// MapCache. 3465236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org// 3466750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Maps keys that are a fixed array of unique names to a map. 3467236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org// Used for canonicalize maps for object literals. 3468c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass MapCache: public HashTable<MapCache, MapCacheShape, HashTableKey*> { 3469236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org public: 3470750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Find cached value for a name key, otherwise return null. 3471236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org Object* Lookup(FixedArray* key); 34729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<MapCache> Put( 34739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<MapCache> map_cache, Handle<FixedArray> key, Handle<Map> value); 3474975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(MapCache) 3475236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 3476236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org private: 3477236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(MapCache); 3478236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org}; 3479236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 3480236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 3481c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate <typename Derived, typename Shape, typename Key> 3482c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass Dictionary: public HashTable<Derived, Shape, Key> { 3483c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org protected: 3484c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org typedef HashTable<Derived, Shape, Key> DerivedHashTable; 3485c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 348643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 348743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the value at entry. 34882abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org Object* ValueAt(int entry) { 3489c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return this->get(DerivedHashTable::EntryToIndex(entry) + 1); 34902abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org } 349143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 349243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Set the value for entry. 3493f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org void ValueAtPut(int entry, Object* value) { 3494c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->set(DerivedHashTable::EntryToIndex(entry) + 1, value); 349543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 349643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 349743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the property details for the property at entry. 349843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PropertyDetails DetailsAt(int entry) { 3499e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(entry >= 0); // Not found is -1, which is not caught by get(). 350086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return PropertyDetails( 3501c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Smi::cast(this->get(DerivedHashTable::EntryToIndex(entry) + 2))); 350243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 350343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 350443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Set the details for entry. 350543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void DetailsAtPut(int entry, PropertyDetails value) { 3506c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->set(DerivedHashTable::EntryToIndex(entry) + 2, value.AsSmi()); 350743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 350843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 350943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Sorting support 351043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void CopyValuesTo(FixedArray* elements); 351143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 351243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Delete a property from the dictionary. 35135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org static Handle<Object> DeleteProperty( 3514865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Derived> dictionary, 35155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org int entry, 35165b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org JSObject::DeleteMode mode); 351743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 351804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org // Attempt to shrink the dictionary after deletion of key. 3519865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org MUST_USE_RESULT static inline Handle<Derived> Shrink( 3520865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Derived> dictionary, 3521865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Key key) { 3522c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return DerivedHashTable::Shrink(dictionary, key); 3523c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 352404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 352543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of elements in the dictionary filtering out properties 352643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // with the specified attributes. 352743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int NumberOfElementsFilterAttributes(PropertyAttributes filter); 352843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 352943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of enumerable elements in the dictionary. 353043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int NumberOfEnumElements(); 353143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35326db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org enum SortMode { UNSORTED, SORTED }; 353343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Copies keys to preallocated fixed array. 35346db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org void CopyKeysTo(FixedArray* storage, 35356db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org PropertyAttributes filter, 35366db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org SortMode sort_mode); 353743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Fill in details for properties into storage. 35388a89641487507e4209d584f03d024a6f76278c1fmachenbach@chromium.org void CopyKeysTo(FixedArray* storage, 35398a89641487507e4209d584f03d024a6f76278c1fmachenbach@chromium.org int index, 35408a89641487507e4209d584f03d024a6f76278c1fmachenbach@chromium.org PropertyAttributes filter, 35418a89641487507e4209d584f03d024a6f76278c1fmachenbach@chromium.org SortMode sort_mode); 354243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 354343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Accessors for next enumeration index. 354443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetNextEnumerationIndex(int index) { 3545e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(index != 0); 3546394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); 354743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 354843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 354943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int NextEnumerationIndex() { 35505b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org return Smi::cast(this->get(kNextEnumerationIndexIndex))->value(); 355143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 355243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Creates a new dictionary. 3554f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org MUST_USE_RESULT static Handle<Derived> New( 35559fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Isolate* isolate, 35569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org int at_least_space_for, 35579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org PretenureFlag pretenure = NOT_TENURED); 35589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 355943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Ensure enough space for n additional elements. 35609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<Derived> EnsureCapacity(Handle<Derived> obj, int n, Key key); 35619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 3562023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#ifdef OBJECT_PRINT 3563f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void Print(OStream& os); // NOLINT 356443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 356543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the key (slow). 356643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* SlowReverseLookup(Object* value); 356743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 356843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Sets the entry to (key, value) pair. 356943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void SetEntry(int entry, 3570865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> key, 3571865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> value); 357244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org inline void SetEntry(int entry, 3573865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> key, 3574865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> value, 357543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PropertyDetails details); 357643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3577f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org MUST_USE_RESULT static Handle<Derived> Add( 3578f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Derived> dictionary, 3579f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Key key, 3580f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Object> value, 3581f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org PropertyDetails details); 358286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 358386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org protected: 358486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Generic at put operation. 3585f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org MUST_USE_RESULT static Handle<Derived> AtPut( 3586f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Derived> dictionary, 3587f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Key key, 3588f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Object> value); 358986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 359086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Add entry to dictionary. 3591865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static void AddEntry( 3592f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Derived> dictionary, 3593f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Key key, 3594f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Object> value, 3595f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org PropertyDetails details, 3596f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org uint32_t hash); 359786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 35983291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Generate new enumeration indices to avoid enumeration index overflow. 3599f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org static void GenerateNewEnumerationIndices(Handle<Derived> dictionary); 3600c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex; 36015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; 360286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 360386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 360486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 3605f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.orgclass NameDictionaryShape : public BaseShape<Handle<Name> > { 360686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 3607f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org static inline bool IsMatch(Handle<Name> key, Object* other); 3608f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org static inline uint32_t Hash(Handle<Name> key); 3609f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org static inline uint32_t HashForObject(Handle<Name> key, Object* object); 3610f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Name> key); 361186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kPrefixSize = 2; 361286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kEntrySize = 3; 361386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const bool kIsEnumerable = true; 361486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 361586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 361686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 3617c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass NameDictionary: public Dictionary<NameDictionary, 3618c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org NameDictionaryShape, 3619f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Name> > { 3620f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org typedef Dictionary< 3621f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org NameDictionary, NameDictionaryShape, Handle<Name> > DerivedDictionary; 3622f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org 362386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 3624975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(NameDictionary) 362586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 362686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Copies enumerable keys to preallocated fixed array. 3627381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org void CopyEnumKeysTo(FixedArray* storage); 3628f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org inline static void DoGenerateNewEnumerationIndices( 3629750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<NameDictionary> dictionary); 363043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3631c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Find entry for key, otherwise return kNotFound. Optimized version of 36324980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org // HashTable::FindEntry. 3633f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org int FindEntry(Handle<Name> key); 363486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 363586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 363686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 3637f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass NumberDictionaryShape : public BaseShape<uint32_t> { 363886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 363986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static inline bool IsMatch(uint32_t key, Object* other); 3640f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, uint32_t key); 364186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kEntrySize = 3; 364286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const bool kIsEnumerable = false; 364386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 364486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 364586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 3646f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass SeededNumberDictionaryShape : public NumberDictionaryShape { 3647f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public: 3648f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const bool UsesSeed = true; 3649f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const int kPrefixSize = 2; 3650f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3651f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static inline uint32_t SeededHash(uint32_t key, uint32_t seed); 3652f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static inline uint32_t SeededHashForObject(uint32_t key, 3653f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com uint32_t seed, 3654f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Object* object); 3655f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}; 3656f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3657f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3658f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass UnseededNumberDictionaryShape : public NumberDictionaryShape { 365986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 3660f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const int kPrefixSize = 0; 3661f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3662f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static inline uint32_t Hash(uint32_t key); 3663f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static inline uint32_t HashForObject(uint32_t key, Object* object); 3664f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}; 3665f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3666f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3667f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass SeededNumberDictionary 3668c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org : public Dictionary<SeededNumberDictionary, 3669c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org SeededNumberDictionaryShape, 3670c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org uint32_t> { 3671f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public: 3672975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(SeededNumberDictionary) 367386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 367486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Type specific at put (default NONE attributes is used when adding). 3675f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org MUST_USE_RESULT static Handle<SeededNumberDictionary> AtNumberPut( 3676f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<SeededNumberDictionary> dictionary, 3677f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org uint32_t key, 3678f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Object> value); 3679b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org MUST_USE_RESULT static Handle<SeededNumberDictionary> AddNumberEntry( 3680b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<SeededNumberDictionary> dictionary, 3681b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t key, 3682b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value, 3683b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org PropertyDetails details); 368486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 368586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Set an existing entry or add a new one if needed. 3686f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Return the updated dictionary. 3687f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com MUST_USE_RESULT static Handle<SeededNumberDictionary> Set( 3688f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<SeededNumberDictionary> dictionary, 3689f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org uint32_t key, 3690f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<Object> value, 3691f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com PropertyDetails details); 3692f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 369386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org void UpdateMaxNumberKey(uint32_t key); 369486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 369586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // If slow elements are required we will never go back to fast-case 369686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // for the elements kept in this dictionary. We require slow 369786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // elements if an element has been added at an index larger than 369886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called 369986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // when defining a getter or setter with a number key. 370086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org inline bool requires_slow_elements(); 370186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org inline void set_requires_slow_elements(); 370286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 370386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Get the value of the max number key that has been added to this 370486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // dictionary. max_number_key can only be called if 370586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // requires_slow_elements returns false. 370686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org inline uint32_t max_number_key(); 370786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 370886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Bit masks. 370986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kRequiresSlowElementsMask = 1; 371086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kRequiresSlowElementsTagSize = 1; 371186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; 371243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 371343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 371443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3715f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass UnseededNumberDictionary 3716c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org : public Dictionary<UnseededNumberDictionary, 3717c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org UnseededNumberDictionaryShape, 3718c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org uint32_t> { 3719f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public: 3720975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(UnseededNumberDictionary) 3721f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3722f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Type specific at put (default NONE attributes is used when adding). 3723f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org MUST_USE_RESULT static Handle<UnseededNumberDictionary> AtNumberPut( 3724f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<UnseededNumberDictionary> dictionary, 3725f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org uint32_t key, 3726f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Object> value); 3727f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org MUST_USE_RESULT static Handle<UnseededNumberDictionary> AddNumberEntry( 3728f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<UnseededNumberDictionary> dictionary, 3729f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org uint32_t key, 3730f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Object> value); 3731f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3732f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set an existing entry or add a new one if needed. 3733f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Return the updated dictionary. 3734f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com MUST_USE_RESULT static Handle<UnseededNumberDictionary> Set( 3735f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<UnseededNumberDictionary> dictionary, 3736f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org uint32_t key, 3737f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<Object> value); 3738f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}; 3739f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3740f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 3741865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgclass ObjectHashTableShape : public BaseShape<Handle<Object> > { 37427943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org public: 3743865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline bool IsMatch(Handle<Object> key, Object* other); 3744865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline uint32_t Hash(Handle<Object> key); 3745865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline uint32_t HashForObject(Handle<Object> key, Object* object); 3746865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key); 37477943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org static const int kPrefixSize = 0; 37489e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static const int kEntrySize = 2; 37497943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org}; 37507943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org 37517943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org 3752394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// ObjectHashTable maps keys that are arbitrary objects to object values by 37537943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org// using the identity hash of the key for hashing purposes. 3754c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass ObjectHashTable: public HashTable<ObjectHashTable, 3755c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org ObjectHashTableShape, 3756865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> > { 3757865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org typedef HashTable< 3758865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org ObjectHashTable, ObjectHashTableShape, Handle<Object> > DerivedHashTable; 37597943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org public: 3760975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ObjectHashTable) 37617943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org 3762057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Attempt to shrink hash table after removal of key. 3763865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org MUST_USE_RESULT static inline Handle<ObjectHashTable> Shrink( 3764865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<ObjectHashTable> table, 3765865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> key); 3766057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 37677a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org // Looks up the value associated with the given key. The hole value is 37687943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org // returned in case the key is not present. 37693484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Object* Lookup(Handle<Object> key); 3770865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 3771196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Adds (or overwrites) the value associated with the given key. 3772057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, 3773057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Handle<Object> key, 3774057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Handle<Object> value); 37757943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org 3776196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Returns an ObjectHashTable (possibly |table|) where |key| has been removed. 3777196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static Handle<ObjectHashTable> Remove(Handle<ObjectHashTable> table, 3778196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Handle<Object> key, 3779196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org bool* was_present); 3780196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 37817943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org private: 37827c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org friend class MarkCompactCollector; 37837c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 3784394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com void AddEntry(int entry, Object* key, Object* value); 3785c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org void RemoveEntry(int entry); 37867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 37877c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Returns the index to the value of an entry. 37887c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org static inline int EntryToValueIndex(int entry) { 37897c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org return EntryToIndex(entry) + 1; 37907c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 37917943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org}; 37927943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org 37937943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org 37948f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// OrderedHashTable is a HashTable with Object keys that preserves 37958f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// insertion order. There are Map and Set interfaces (OrderedHashMap 37968f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// and OrderedHashTable, below). It is meant to be used by JSMap/JSSet. 37978f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// 379879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org// Only Object* keys are supported, with Object::SameValueZero() used as the 37998f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// equality operator and Object::GetHash() for the hash function. 38008f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// 38018f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// Based on the "Deterministic Hash Table" as described by Jason Orendorff at 38028f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables 38038f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// Originally attributed to Tyler Close. 38048f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// 38058f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// Memory layout: 38068f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// [0]: bucket count 38078f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// [1]: element count 38088f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// [2]: deleted element count 38096a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [3..(3 + NumberOfBuckets() - 1)]: "hash table", where each item is an 38106a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// offset into the data table (see below) where the 38116a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// first item in this bucket is stored. 38126a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [3 + NumberOfBuckets()..length]: "data table", an array of length 38138f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// Capacity() * kEntrySize, where the first entrysize 38148f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// items are handled by the derived class and the 38158f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// item at kChainOffset is another entry into the 38168f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// data table indicating the next entry in this hash 38178f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org// bucket. 38186a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// 38196a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// When we transition the table to a new version we obsolete it and reuse parts 38206a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// of the memory to store information how to transition an iterator to the new 38216a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// table: 38226a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// 38236a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// Memory layout for obsolete table: 38246a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [0]: bucket count 38256a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [1]: Next newer table 38266a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [2]: Number of removed holes or -1 when the table was cleared. 38276a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [3..(3 + NumberOfRemovedHoles() - 1)]: The indexes of the removed holes. 38286a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [3 + NumberOfRemovedHoles()..length]: Not used 38296a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// 38304ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgtemplate<class Derived, class Iterator, int entrysize> 38318f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.orgclass OrderedHashTable: public FixedArray { 38328f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org public: 38338f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Returns an OrderedHashTable with a capacity of at least |capacity|. 38348f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static Handle<Derived> Allocate( 38358f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Isolate* isolate, int capacity, PretenureFlag pretenure = NOT_TENURED); 38368f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38378f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Returns an OrderedHashTable (possibly |table|) with enough space 38389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org // to add at least one new element. 38398f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static Handle<Derived> EnsureGrowable(Handle<Derived> table); 38408f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38418f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Returns an OrderedHashTable (possibly |table|) that's shrunken 38428f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // if possible. 38438f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static Handle<Derived> Shrink(Handle<Derived> table); 38448f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 3845196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Returns a new empty OrderedHashTable and records the clearing so that 3846196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // exisiting iterators can be updated. 38474ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org static Handle<Derived> Clear(Handle<Derived> table); 38484ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 3849196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // Returns an OrderedHashTable (possibly |table|) where |key| has been 3850196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // removed. 3851196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org static Handle<Derived> Remove(Handle<Derived> table, Handle<Object> key, 3852196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org bool* was_present); 3853196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 38548f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Returns kNotFound if the key isn't present. 385512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int FindEntry(Handle<Object> key, int hash); 385612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 385712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Like the above, but doesn't require the caller to provide a hash. 38583484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int FindEntry(Handle<Object> key); 38598f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38608f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int NumberOfElements() { 38618f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return Smi::cast(get(kNumberOfElementsIndex))->value(); 38628f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 38638f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38648f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int NumberOfDeletedElements() { 38658f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return Smi::cast(get(kNumberOfDeletedElementsIndex))->value(); 38668f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 38678f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38684ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org int UsedCapacity() { return NumberOfElements() + NumberOfDeletedElements(); } 38694ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 38708f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int NumberOfBuckets() { 38718f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return Smi::cast(get(kNumberOfBucketsIndex))->value(); 38728f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 38738f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38748f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Returns the index into the data table where the new entry 38758f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // should be placed. The table is assumed to have enough space 38768f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // for a new entry. 38778f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int AddEntry(int hash); 38788f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38798f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Removes the entry, and puts the_hole in entrysize pointers 38808f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // (leaving the hash table chain intact). 38818f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org void RemoveEntry(int entry); 38828f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38838f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Returns an index into |this| for the given entry. 38848f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int EntryToIndex(int entry) { 38858f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return kHashTableStartIndex + NumberOfBuckets() + (entry * kEntrySize); 38868f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 38878f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 38884ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } 38894ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 38906a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org bool IsObsolete() { 38916a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org return !get(kNextTableIndex)->IsSmi(); 38926a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org } 38936a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org 38946a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org // The next newer table. This is only valid if the table is obsolete. 38956a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org Derived* NextTable() { 38966a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org return Derived::cast(get(kNextTableIndex)); 38976a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org } 38986a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org 38996a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org // When the table is obsolete we store the indexes of the removed holes. 39006a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org int RemovedIndexAt(int index) { 39016a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org return Smi::cast(get(kRemovedHolesIndex + index))->value(); 39026a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org } 39036a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org 39048f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kNotFound = -1; 39054ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org static const int kMinCapacity = 4; 39068f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39078f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org private: 39088f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static Handle<Derived> Rehash(Handle<Derived> table, int new_capacity); 39098f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39108f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org void SetNumberOfBuckets(int num) { 39118f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org set(kNumberOfBucketsIndex, Smi::FromInt(num)); 39128f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39138f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39148f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org void SetNumberOfElements(int num) { 39158f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org set(kNumberOfElementsIndex, Smi::FromInt(num)); 39168f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39178f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39188f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org void SetNumberOfDeletedElements(int num) { 39198f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org set(kNumberOfDeletedElementsIndex, Smi::FromInt(num)); 39208f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39218f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39228f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int Capacity() { 39238f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return NumberOfBuckets() * kLoadFactor; 39248f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39258f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39268f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org // Returns the next entry for the given entry. 39278f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int ChainAt(int entry) { 39288f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return Smi::cast(get(EntryToIndex(entry) + kChainOffset))->value(); 39298f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39308f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39318f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int HashToBucket(int hash) { 39328f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return hash & (NumberOfBuckets() - 1); 39338f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39348f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39358f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int HashToEntry(int hash) { 39368f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int bucket = HashToBucket(hash); 39378f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return Smi::cast(get(kHashTableStartIndex + bucket))->value(); 39388f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39398f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39406a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org void SetNextTable(Derived* next_table) { 39416a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org set(kNextTableIndex, next_table); 39426a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org } 39436a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org 39446a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org void SetRemovedIndexAt(int index, int removed_index) { 39456a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org return set(kRemovedHolesIndex + index, Smi::FromInt(removed_index)); 39466a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org } 39476a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org 39488f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kNumberOfBucketsIndex = 0; 39498f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kNumberOfElementsIndex = kNumberOfBucketsIndex + 1; 39508f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kNumberOfDeletedElementsIndex = kNumberOfElementsIndex + 1; 39516a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org static const int kHashTableStartIndex = kNumberOfDeletedElementsIndex + 1; 39526a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org 39536a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org static const int kNextTableIndex = kNumberOfElementsIndex; 39546a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org static const int kRemovedHolesIndex = kHashTableStartIndex; 39558f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39568f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kEntrySize = entrysize + 1; 39578f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kChainOffset = entrysize; 39588f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39598f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kLoadFactor = 2; 39608f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kMaxCapacity = 39618f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org (FixedArray::kMaxLength - kHashTableStartIndex) 39628f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org / (1 + (kEntrySize * kLoadFactor)); 39638f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org}; 39648f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39658f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39664ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgclass JSSetIterator; 39674ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 39684ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 39694ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgclass OrderedHashSet: public OrderedHashTable< 39704ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org OrderedHashSet, JSSetIterator, 1> { 39718f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org public: 3972975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(OrderedHashSet) 39738f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39743484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org bool Contains(Handle<Object> key); 39758f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static Handle<OrderedHashSet> Add( 39768f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Handle<OrderedHashSet> table, Handle<Object> key); 39778f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org}; 39788f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39798f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39804ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgclass JSMapIterator; 39814ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 39824ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 39834ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgclass OrderedHashMap:public OrderedHashTable< 39844ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org OrderedHashMap, JSMapIterator, 2> { 39858f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org public: 3986975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(OrderedHashMap) 39878f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39883484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Object* Lookup(Handle<Object> key); 39898f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static Handle<OrderedHashMap> Put( 39908f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Handle<OrderedHashMap> table, 39918f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Handle<Object> key, 39928f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Handle<Object> value); 39938f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 39948f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Object* ValueAt(int entry) { 39958f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return get(EntryToIndex(entry) + kValueOffset); 39968f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 39978f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 399847390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org private: 39998f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org static const int kValueOffset = 1; 40008f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org}; 40018f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 40028f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org 400325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgtemplate <int entrysize> 4004865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgclass WeakHashTableShape : public BaseShape<Handle<Object> > { 400525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org public: 4006865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline bool IsMatch(Handle<Object> key, Object* other); 4007865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline uint32_t Hash(Handle<Object> key); 4008865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline uint32_t HashForObject(Handle<Object> key, Object* object); 4009865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key); 401025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org static const int kPrefixSize = 0; 401125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org static const int kEntrySize = entrysize; 401225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org}; 401325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 401425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 401525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org// WeakHashTable maps keys that are arbitrary objects to object values. 401625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org// It is used for the global weak hash table that maps objects 401725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org// embedded in optimized code to dependent code lists. 4018c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass WeakHashTable: public HashTable<WeakHashTable, 4019c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org WeakHashTableShape<2>, 4020865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> > { 4021865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org typedef HashTable< 4022865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org WeakHashTable, WeakHashTableShape<2>, Handle<Object> > DerivedHashTable; 402325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org public: 4024975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(WeakHashTable) 402525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 402625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // Looks up the value associated with the given key. The hole value is 402725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // returned in case the key is not present. 40283484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Object* Lookup(Handle<Object> key); 4029865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 403025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // Adds (or overwrites) the value associated with the given key. Mapping a 403125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // key to the hole value causes removal of the whole entry. 4032865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org MUST_USE_RESULT static Handle<WeakHashTable> Put(Handle<WeakHashTable> table, 4033865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> key, 4034865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org Handle<Object> value); 403525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 4036dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org // This function is called when heap verification is turned on. 4037dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org void Zap(Object* value) { 4038dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org int capacity = Capacity(); 4039dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org for (int i = 0; i < capacity; i++) { 4040dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org set(EntryToIndex(i), value); 4041dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org set(EntryToValueIndex(i), value); 4042dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org } 4043dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org } 4044dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org 404525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org private: 404625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org friend class MarkCompactCollector; 404725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 4048865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org void AddEntry(int entry, Handle<Object> key, Handle<Object> value); 404925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 405025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // Returns the index to the value of an entry. 405125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org static inline int EntryToValueIndex(int entry) { 405225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org return EntryToIndex(entry) + 1; 405325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org } 405425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org}; 405525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 405625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 4057c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// JSFunctionResultCache caches results of some JSFunction invocation. 4058c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// It is a fixed array with fixed structure: 4059c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// [0]: factory function 4060c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// [1]: finger index 4061c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// [2]: current cache size 4062c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// [3]: dummy field. 4063c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// The rest of array are key/value pairs. 4064c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.orgclass JSFunctionResultCache: public FixedArray { 4065c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org public: 4066c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static const int kFactoryIndex = 0; 4067c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static const int kFingerIndex = kFactoryIndex + 1; 4068c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static const int kCacheSizeIndex = kFingerIndex + 1; 4069c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static const int kDummyIndex = kCacheSizeIndex + 1; 4070c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static const int kEntriesIndex = kDummyIndex + 1; 4071397e23cb4f6fae2f4b020b914ce08c8b150c12e2antonm@chromium.org 4072397e23cb4f6fae2f4b020b914ce08c8b150c12e2antonm@chromium.org static const int kEntrySize = 2; // key + value 4073ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 4074720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org static const int kFactoryOffset = kHeaderSize; 4075720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org static const int kFingerOffset = kFactoryOffset + kPointerSize; 4076720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org static const int kCacheSizeOffset = kFingerOffset + kPointerSize; 4077720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 4078ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org inline void MakeZeroSize(); 4079ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org inline void Clear(); 4080ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 40810511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com inline int size(); 40820511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com inline void set_size(int size); 40830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com inline int finger_index(); 40840511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com inline void set_finger_index(int finger_index); 40850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 4086975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSFunctionResultCache) 4087ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 4088c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSFunctionResultCache) 4089c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org}; 4090c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 4091c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 4092c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// ScopeInfo represents information about different scopes of a source 4093c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// program and the allocation of the scope's variables. Scope information 4094c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// is stored in a compressed form in ScopeInfo objects and is used 4095c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// at runtime (stack dumps, deoptimization, etc.). 4096c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4097b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org// This object provides quick access to scope info details for runtime 4098c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// routines. 4099c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgclass ScopeInfo : public FixedArray { 4100c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public: 4101975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ScopeInfo) 4102b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4103394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Return the type of this scope. 4104dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org ScopeType scope_type(); 4105394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 4106b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // Does this scope call eval? 4107b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org bool CallsEval(); 4108b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4109486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // Return the strict mode of this scope. 4110486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode(); 4111b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4112486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // Does this scope make a sloppy eval call? 4113486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org bool CallsSloppyEval() { return CallsEval() && strict_mode() == SLOPPY; } 4114c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4115c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the total number of locals allocated on the stack and in the 4116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // context. This includes the parameters that are allocated in the context. 4117c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int LocalCount(); 4118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the number of stack slots for code. This number consists of two 4120c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // parts: 4121c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 1. One stack slot per stack allocated local. 4122c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 2. One stack slot for the function name if it is stack allocated. 4123c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int StackSlotCount(); 4124b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4125c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the number of context slots for code if a context is allocated. This 4126c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // number consists of three parts: 4127c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 1. Size of fixed header for every context: Context::MIN_CONTEXT_SLOTS 4128c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 2. One context slot per context allocated local. 4129c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 3. One context slot for the function name if it is context allocated. 4130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Parameters allocated in the context count as context allocated locals. If 4131c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // no contexts are allocated for this scope ContextLength returns 0. 4132c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int ContextLength(); 4133b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4134c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Is this scope the scope of a named function expression? 4135c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org bool HasFunctionName(); 4136c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4137c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return if this has context allocated locals. 4138b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org bool HasHeapAllocatedLocals(); 4139b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4140394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Return if contexts are allocated for this scope. 4141394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com bool HasContext(); 4142394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 4143a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Return if this is a function scope with "use asm". 4144a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org bool IsAsmModule() { return AsmModuleField::decode(Flags()); } 4145a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 4146a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Return if this is a nested function within an asm module scope. 4147a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org bool IsAsmFunction() { return AsmFunctionField::decode(Flags()); } 4148a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 4149c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the function_name if present. 4150c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org String* FunctionName(); 4151c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4152c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the name of the given parameter. 4153c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org String* ParameterName(int var); 4154c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4155c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the name of the given local. 4156c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org String* LocalName(int var); 4157c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4158c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the name of the given stack local. 4159c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org String* StackLocalName(int var); 4160c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4161c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the name of the given context local. 4162c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org String* ContextLocalName(int var); 4163c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4164c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the mode of the given context local. 4165c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org VariableMode ContextLocalMode(int var); 4166c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4167c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Return the initialization flag of the given context local. 4168c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org InitializationFlag ContextLocalInitFlag(int var); 4169c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 41707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Return the initialization flag of the given context local. 41717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MaybeAssignedFlag ContextLocalMaybeAssignedFlag(int var); 41727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 41735aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org // Return true if this local was introduced by the compiler, and should not be 41745aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org // exposed to the user in a debugger. 41755aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org bool LocalIsSynthetic(int var); 41765aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org 4177b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // Lookup support for serialized scope info. Returns the 4178b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // the stack slot index for a given slot name if the slot is 41794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // present; otherwise returns a value < 0. The name must be an internalized 41804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // string. 4181b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org int StackSlotIndex(String* name); 4182b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4183b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // Lookup support for serialized scope info. Returns the 4184b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // context slot index for a given slot name if the slot is present; otherwise 41854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // returns a value < 0. The name must be an internalized string. 4186b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // If the slot is present and mode != NULL, sets *mode to the corresponding 4187b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // mode for that variable. 41887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static int ContextSlotIndex(Handle<ScopeInfo> scope_info, Handle<String> name, 41897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org VariableMode* mode, InitializationFlag* init_flag, 41907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MaybeAssignedFlag* maybe_assigned_flag); 4191b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4192b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // Lookup support for serialized scope info. Returns the 4193b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // parameter index for a given parameter name if the parameter is present; 41944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // otherwise returns a value < 0. The name must be an internalized string. 4195b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org int ParameterIndex(String* name); 4196b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 419728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Lookup support for serialized scope info. Returns the function context 419828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // slot index if the function name is present and context-allocated (named 4199b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // function expressions, only), otherwise returns a value < 0. The name 42004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // must be an internalized string. 4201394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int FunctionContextSlotIndex(String* name, VariableMode* mode); 4202b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 420371fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org 420471fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org // Copies all the context locals into an object used to materialize a scope. 4205d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org static bool CopyContextLocalsToScopeObject(Handle<ScopeInfo> scope_info, 4206d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org Handle<Context> context, 4207d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org Handle<JSObject> scope_object); 420871fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org 420971fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org 42107028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org static Handle<ScopeInfo> Create(Scope* scope, Zone* zone); 4211b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4212b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // Serializes empty scope info. 42138432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org static ScopeInfo* Empty(Isolate* isolate); 4214c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4215c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG 4216c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org void Print(); 4217c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif 4218c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4219c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // The layout of the static part of a ScopeInfo is as follows. Each entry is 4220c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // numeric and occupies one array slot. 4221c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 1. A set of properties of the scope 4222c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 2. The number of parameters. This only applies to function scopes. For 4223c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // non-function scopes this is 0. 4224c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 3. The number of non-parameter variables allocated on the stack. 4225c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 4. The number of non-parameter and parameter variables allocated in the 4226c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // context. 4227c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define FOR_EACH_NUMERIC_FIELD(V) \ 4228c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org V(Flags) \ 4229c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org V(ParameterCount) \ 4230c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org V(StackLocalCount) \ 4231c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org V(ContextLocalCount) 4232c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4233c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define FIELD_ACCESSORS(name) \ 4234c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org void Set##name(int value) { \ 4235c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org set(k##name, Smi::FromInt(value)); \ 4236c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } \ 4237c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int name() { \ 4238c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (length() > 0) { \ 4239c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Smi::cast(get(k##name))->value(); \ 4240c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { \ 4241c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return 0; \ 4242c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } \ 4243c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 4244c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org FOR_EACH_NUMERIC_FIELD(FIELD_ACCESSORS) 4245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef FIELD_ACCESSORS 4246b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4247b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org private: 4248c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org enum { 4249c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define DECL_INDEX(name) k##name, 4250c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org FOR_EACH_NUMERIC_FIELD(DECL_INDEX) 4251c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef DECL_INDEX 4252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef FOR_EACH_NUMERIC_FIELD 425381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kVariablePartIndex 4254c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org }; 4255b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4256c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // The layout of the variable part of a ScopeInfo is as follows: 4257c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 1. ParameterEntries: 4258c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // This part stores the names of the parameters for function scopes. One 4259c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // slot is used per parameter, so in total this part occupies 4260c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // ParameterCount() slots in the array. For other scopes than function 4261c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // scopes ParameterCount() is 0. 4262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 2. StackLocalEntries: 4263c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Contains the names of local variables that are allocated on the stack, 4264c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // in increasing order of the stack slot index. One slot is used per stack 4265c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // local, so in total this part occupies StackLocalCount() slots in the 4266c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // array. 4267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 3. ContextLocalNameEntries: 4268c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Contains the names of local variables and parameters that are allocated 4269c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // in the context. They are stored in increasing order of the context slot 4270c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // index starting with Context::MIN_CONTEXT_SLOTS. One slot is used per 4271c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // context local, so in total this part occupies ContextLocalCount() slots 4272c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // in the array. 4273c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 4. ContextLocalInfoEntries: 4274c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Contains the variable modes and initialization flags corresponding to 4275c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // the context locals in ContextLocalNameEntries. One slot is used per 4276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // context local, so in total this part occupies ContextLocalCount() 4277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // slots in the array. 4278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // 5. FunctionNameEntryIndex: 4279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // If the scope belongs to a named function expression this part contains 4280c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // information about the function variable. It always occupies two array 4281c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // slots: a. The name of the function variable. 4282c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // b. The context or stack slot index for the variable. 4283c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int ParameterEntriesIndex(); 4284c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int StackLocalEntriesIndex(); 4285c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int ContextLocalNameEntriesIndex(); 4286c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int ContextLocalInfoEntriesIndex(); 4287c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int FunctionNameEntryIndex(); 4288c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4289c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Location of the function variable for named function expressions. 4290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org enum FunctionVariableInfo { 4291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org NONE, // No function name present. 4292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org STACK, // Function 4293c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org CONTEXT, 4294c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UNUSED 4295c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org }; 4296b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Properties of scopes. 4298dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org class ScopeTypeField: public BitField<ScopeType, 0, 3> {}; 4299c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org class CallsEvalField: public BitField<bool, 3, 1> {}; 4300486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org class StrictModeField: public BitField<StrictMode, 4, 1> {}; 4301486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org class FunctionVariableField: public BitField<FunctionVariableInfo, 5, 2> {}; 4302486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org class FunctionVariableMode: public BitField<VariableMode, 7, 3> {}; 4303a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org class AsmModuleField : public BitField<bool, 10, 1> {}; 4304a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org class AsmFunctionField : public BitField<bool, 11, 1> {}; 4305c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 4306c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // BitFields representing the encoded information for context locals in the 4307c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // ContextLocalInfoEntries part. 4308c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org class ContextLocalMode: public BitField<VariableMode, 0, 3> {}; 4309c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org class ContextLocalInitFlag: public BitField<InitializationFlag, 3, 1> {}; 43107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class ContextLocalMaybeAssignedFlag 43117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : public BitField<MaybeAssignedFlag, 4, 1> {}; 4312b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org}; 4313b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 4314b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 431565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// The cache for maps used by normalized (dictionary mode) objects. 431665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// Such maps do not have property descriptors, so a typical program 431765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// needs very limited number of distinct normalized maps. 431865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.orgclass NormalizedMapCache: public FixedArray { 431965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org public: 4320c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org static Handle<NormalizedMapCache> New(Isolate* isolate); 432165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4322c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org MUST_USE_RESULT MaybeHandle<Map> Get(Handle<Map> fast_map, 4323c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org PropertyNormalizationMode mode); 4324c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org void Set(Handle<Map> fast_map, Handle<Map> normalized_map); 432565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 432665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org void Clear(); 432765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4328975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(NormalizedMapCache) 4329975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 433008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org static inline bool IsNormalizedMapCache(const Object* obj); 433165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4332c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(NormalizedMapCache) 4333c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org private: 4334c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org static const int kEntries = 64; 4335c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 4336c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org static inline int GetIndex(Handle<Map> map); 4337c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 4338c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org // The following declarations hide base class methods. 4339c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org Object* get(int index); 4340c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org void set(int index, Object* value); 434165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org}; 434265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 434365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4344c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// ByteArray represents fixed sized byte arrays. Used for the relocation info 4345c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// that is attached to code objects. 43464acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgclass ByteArray: public FixedArrayBase { 434743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 4348c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline int Size() { return RoundUp(length() + kHeaderSize, kPointerSize); } 4349c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 435043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Setter and getter. 435143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline byte get(int index); 435243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set(int index, byte value); 435343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 435443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Treat contents as an int array. 435543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int get_int(int index); 435643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 435743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int SizeFor(int length) { 435830ce411529579186181838984710b0b0980857aaricow@chromium.org return OBJECT_POINTER_ALIGN(kHeaderSize + length); 435943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 436043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // We use byte arrays for free blocks in the heap. Given a desired size in 436143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // bytes that is a multiple of the word size and big enough to hold a byte 436243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // array, this function returns the number of elements a byte array should 436343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // have. 436443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int LengthFor(int size_in_bytes) { 4365e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsAligned(size_in_bytes, kPointerSize)); 4366e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(size_in_bytes >= kHeaderSize); 436743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return size_in_bytes - kHeaderSize; 436843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 436943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 437043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns data start address. 437143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Address GetDataStartAddress(); 437243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 437343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns a pointer to the ByteArray object for a given data start address. 437443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline ByteArray* FromDataStartAddress(Address address); 437543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4376975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ByteArray) 437743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 437843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 4379ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org inline int ByteArraySize() { 4380ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return SizeFor(this->length()); 4381ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 4382a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(ByteArray) 4383c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(ByteArray) 438443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 438530ce411529579186181838984710b0b0980857aaricow@chromium.org // Layout description. 438630ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); 4387e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 43880c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Maximal memory consumption for a single ByteArray. 43890c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org static const int kMaxSize = 512 * MB; 43900c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Maximal length of a single ByteArray. 43910c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org static const int kMaxLength = kMaxSize - kHeaderSize; 43920c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 439343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 439443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArray); 439543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 439643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 439743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4398c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// FreeSpace represents fixed sized areas of the heap that are not currently in 4399c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// use. Used by the heap and GC. 4400c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass FreeSpace: public HeapObject { 4401c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public: 4402c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // [size]: size of the free space including the header. 44034b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int size() const; 4404c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void set_size(int value); 4405c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 44064b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int nobarrier_size() const; 44079e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org inline void nobarrier_set_size(int value); 44089e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 4409c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline int Size() { return size(); } 4410c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4411975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(FreeSpace) 4412c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4413a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4414a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(FreeSpace) 4415c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(FreeSpace) 4416c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4417c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Layout description. 4418c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Size is smi tagged when it is stored. 4419c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kSizeOffset = HeapObject::kHeaderSize; 4420c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kHeaderSize = kSizeOffset + kPointerSize; 4421c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4422c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); 4423c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4424c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private: 4425c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com DISALLOW_IMPLICIT_CONSTRUCTORS(FreeSpace); 4426c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 4427c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4428c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4429af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org// V has parameters (Type, type, TYPE, C type, element_size) 4430af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define TYPED_ARRAYS(V) \ 4431af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Uint8, uint8, UINT8, uint8_t, 1) \ 4432af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Int8, int8, INT8, int8_t, 1) \ 4433af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Uint16, uint16, UINT16, uint16_t, 2) \ 4434af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Int16, int16, INT16, int16_t, 2) \ 4435af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Uint32, uint32, UINT32, uint32_t, 4) \ 4436af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Int32, int32, INT32, int32_t, 4) \ 4437af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Float32, float32, FLOAT32, float, 4) \ 4438af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Float64, float64, FLOAT64, double, 8) \ 4439af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org V(Uint8Clamped, uint8_clamped, UINT8_CLAMPED, uint8_t, 1) 4440af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 4441af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 4442af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 44433811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// An ExternalArray represents a fixed-size array of primitive values 44443811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// which live outside the JavaScript heap. Its subclasses are used to 44453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// implement the CanvasArray types being defined in the WebGL 44463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// specification. As of this writing the first public draft is not yet 44473811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// available, but Khronos members can access the draft at: 44483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// https://cvs.khronos.org/svn/repos/3dweb/trunk/doc/spec/WebGL-spec.html 44493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// 44503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// The semantics of these arrays differ from CanvasPixelArray. 44513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// Out-of-range values passed to the setter are converted via a C 44523811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// cast, not clamping. Out-of-range indices cause exceptions to be 44533811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// raised rather than being silently ignored. 44544acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgclass ExternalArray: public FixedArrayBase { 44553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 44567c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline bool is_the_hole(int index) { return false; } 44577c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 44583811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // [external_pointer]: The pointer to the external memory area backing this 44593811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // external array. 44603811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org DECL_ACCESSORS(external_pointer, void) // Pointer to the data store. 44613811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4462975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalArray) 44633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 44643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Maximal acceptable length for an external array. 44653811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org static const int kMaxLength = 0x3fffffff; 44663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 44673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // ExternalArray headers are not quadword aligned. 446830ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kExternalPointerOffset = 44694acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org POINTER_SIZE_ALIGN(FixedArrayBase::kLengthOffset + kPointerSize); 44703811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org static const int kHeaderSize = kExternalPointerOffset + kPointerSize; 447130ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); 44723811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 44733811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 44743811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalArray); 44753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 44763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 44773811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4478af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org// A ExternalUint8ClampedArray represents a fixed-size byte array with special 44794d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org// semantics used for implementing the CanvasPixelArray object. Please see the 44804d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org// specification at: 44814d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 44824d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org// http://www.whatwg.org/specs/web-apps/current-work/ 44834d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org// multipage/the-canvas-element.html#canvaspixelarray 44844d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org// In particular, write access clamps the value written to 0 or 255 if the 44854d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org// value written is outside this range. 4486af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalUint8ClampedArray: public ExternalArray { 44874d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org public: 4488af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org inline uint8_t* external_uint8_clamped_pointer(); 44894d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 44904d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // Setter and getter. 44917c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline uint8_t get_scalar(int index); 44929e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalUint8ClampedArray> array, 44939e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org int index); 44944d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org inline void set(int index, uint8_t value); 44954d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 4496e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4497e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined and clamps the converted value between 0 and 255. 4498af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalUint8ClampedArray> array, 4499af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org uint32_t index, 4500af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org Handle<Object> value); 4501af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 4502975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalUint8ClampedArray) 45034d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 4504a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4505af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalUint8ClampedArray) 4506af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalUint8ClampedArray) 45074d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 45084d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org private: 4509af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUint8ClampedArray); 45104d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org}; 45114d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 45124d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 4513af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalInt8Array: public ExternalArray { 45143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 45153811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Setter and getter. 45167c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline int8_t get_scalar(int index); 45179e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalInt8Array> array, int index); 45183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline void set(int index, int8_t value); 45193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4520e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4521e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4522af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalInt8Array> array, 4523b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4524b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4525b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4526975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalInt8Array) 45273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4528a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4529af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalInt8Array) 4530af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalInt8Array) 45313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 45323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 4533af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalInt8Array); 45343811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 45353811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 45363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4537af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalUint8Array: public ExternalArray { 45383811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 45393811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Setter and getter. 45407c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline uint8_t get_scalar(int index); 45419e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalUint8Array> array, int index); 45423811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline void set(int index, uint8_t value); 45433811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4544e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4545e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4546af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalUint8Array> array, 4547b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4548b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4549b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4550975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalUint8Array) 45513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4552a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4553af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalUint8Array) 4554af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalUint8Array) 45553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 45563811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 4557af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUint8Array); 45583811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 45593811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 45603811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4561af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalInt16Array: public ExternalArray { 45623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 45633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Setter and getter. 45647c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline int16_t get_scalar(int index); 45659e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalInt16Array> array, int index); 45663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline void set(int index, int16_t value); 45673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4568e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4569e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4570af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalInt16Array> array, 4571b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4572b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4573b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4574975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalInt16Array) 45753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4576a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4577af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalInt16Array) 4578af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalInt16Array) 45793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 45803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 4581af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalInt16Array); 45823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 45833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 45843811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4585af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalUint16Array: public ExternalArray { 45863811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 45873811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Setter and getter. 45887c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline uint16_t get_scalar(int index); 45899e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalUint16Array> array, 45909e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org int index); 45913811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline void set(int index, uint16_t value); 45923811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4593e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4594e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4595af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalUint16Array> array, 4596b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4597b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4598b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4599975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalUint16Array) 46003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4601a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4602af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalUint16Array) 4603af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalUint16Array) 46043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 4606af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUint16Array); 46073811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 46083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46093811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4610af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalInt32Array: public ExternalArray { 46113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 46123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Setter and getter. 46137c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline int32_t get_scalar(int index); 46149e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalInt32Array> array, int index); 46153811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline void set(int index, int32_t value); 46163811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4617e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4618e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4619af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalInt32Array> array, 4620b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4621b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4622b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4623975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalInt32Array) 46243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4625a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4626af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalInt32Array) 4627af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalInt32Array) 46283811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 4630af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalInt32Array); 46313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 46323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46333811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4634af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalUint32Array: public ExternalArray { 46353811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 46363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Setter and getter. 46377c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline uint32_t get_scalar(int index); 46389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalUint32Array> array, 46399e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org int index); 46403811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline void set(int index, uint32_t value); 46413811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4642e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4643e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4644af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalUint32Array> array, 4645b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4646b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4647b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4648975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalUint32Array) 46493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4650a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4651af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalUint32Array) 4652af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalUint32Array) 46533811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46543811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 4655af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUint32Array); 46563811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 46573811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46583811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4659af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalFloat32Array: public ExternalArray { 46603811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public: 46613811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Setter and getter. 46627c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline float get_scalar(int index); 46639e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalFloat32Array> array, 46649e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org int index); 46653811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org inline void set(int index, float value); 46663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4667e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4668e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4669af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalFloat32Array> array, 4670b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4671b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4672b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4673975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalFloat32Array) 46743811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4675a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4676af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalFloat32Array) 4677af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalFloat32Array) 46783811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private: 4680af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalFloat32Array); 46813811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}; 46823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 46833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4684af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgclass ExternalFloat64Array: public ExternalArray { 46853847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com public: 46863847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com // Setter and getter. 46877c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org inline double get_scalar(int index); 46889e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<ExternalFloat64Array> array, 46899e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org int index); 46903847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com inline void set(int index, double value); 46913847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 4692e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 4693e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // and undefined. 4694af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org static Handle<Object> SetValue(Handle<ExternalFloat64Array> array, 4695b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 4696b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 4697b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 4698975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalFloat64Array) 46993847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 4700a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 4701af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_PRINTER(ExternalFloat64Array) 4702af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DECLARE_VERIFIER(ExternalFloat64Array) 47033847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 47043847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com private: 4705af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalFloat64Array); 47063847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com}; 47073847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 47083847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 47095c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgclass FixedTypedArrayBase: public FixedArrayBase { 47105c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org public: 4711975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(FixedTypedArrayBase) 47125c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47135c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org static const int kDataOffset = kHeaderSize; 47145c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47155c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org inline int size(); 47165c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 4717d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org inline int TypedArraySize(InstanceType type); 4718d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 4719895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org // Use with care: returns raw pointer into heap. 4720895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline void* DataPtr(); 4721895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 4722895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org inline int DataSize(); 4723895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 47245c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org private: 4725d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org inline int DataSize(InstanceType type); 4726d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 47275c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArrayBase); 47285c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}; 47295c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47305c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47315c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgtemplate <class Traits> 47325c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgclass FixedTypedArray: public FixedTypedArrayBase { 47335c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org public: 47345c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org typedef typename Traits::ElementType ElementType; 47355c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org static const InstanceType kInstanceType = Traits::kInstanceType; 47365c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 4737975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(FixedTypedArray<Traits>) 47385c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 473957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org static inline int ElementOffset(int index) { 474057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org return kDataOffset + index * sizeof(ElementType); 474157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org } 474257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 47435c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org static inline int SizeFor(int length) { 474457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org return ElementOffset(length); 47455c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } 47465c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47475c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org inline ElementType get_scalar(int index); 47489e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<Object> get(Handle<FixedTypedArray> array, int index); 47495c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org inline void set(int index, ElementType value); 47505c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 4751895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org static inline ElementType from_int(int value); 4752895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org static inline ElementType from_double(double value); 4753895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 47545c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // This accessor applies the correct conversion from Smi, HeapNumber 47555c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // and undefined. 47565c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org static Handle<Object> SetValue(Handle<FixedTypedArray<Traits> > array, 47575c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org uint32_t index, 47585c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org Handle<Object> value); 47595c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47605c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org DECLARE_PRINTER(FixedTypedArray) 47615c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org DECLARE_VERIFIER(FixedTypedArray) 47625c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47635c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org private: 47645c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArray); 47655c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}; 47665c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 4767af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define FIXED_TYPED_ARRAY_TRAITS(Type, type, TYPE, elementType, size) \ 47685c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org class Type##ArrayTraits { \ 47693c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org public: /* NOLINT */ \ 47703c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org typedef elementType ElementType; \ 47713c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const InstanceType kInstanceType = FIXED_##TYPE##_ARRAY_TYPE; \ 47723c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const char* Designator() { return #type " array"; } \ 47733c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static inline Handle<Object> ToHandle(Isolate* isolate, \ 47743c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org elementType scalar); \ 47753c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static inline elementType defaultValue(); \ 47765c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org }; \ 47775c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org \ 47785c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org typedef FixedTypedArray<Type##ArrayTraits> Fixed##Type##Array; 47795c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 4780af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTYPED_ARRAYS(FIXED_TYPED_ARRAY_TRAITS) 47815c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 47825c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org#undef FIXED_TYPED_ARRAY_TRAITS 47835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 4784a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// DeoptimizationInputData is a fixed array used to hold the deoptimization 4785a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// data for code generated by the Hydrogen/Lithium compiler. It also 4786a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// contains information about functions that were inlined. If N different 4787a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// functions were inlined then first N elements of the literal array will 4788a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// contain these functions. 4789a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// 4790a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// It can be empty. 4791a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass DeoptimizationInputData: public FixedArray { 4792a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public: 4793a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Layout description. Indices in the array. 47946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kTranslationByteArrayIndex = 0; 47956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kInlinedFunctionCountIndex = 1; 47966474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kLiteralArrayIndex = 2; 47976474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kOsrAstIdIndex = 3; 47986474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kOsrPcOffsetIndex = 4; 47996474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kOptimizationIdIndex = 5; 48006474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kSharedFunctionInfoIndex = 6; 48016474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kFirstDeoptEntryIndex = 7; 4802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Offsets of deopt entry elements relative to the start of the entry. 4804471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static const int kAstIdRawOffset = 0; 4805a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const int kTranslationIndexOffset = 1; 4806a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const int kArgumentsStackHeightOffset = 2; 480727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org static const int kPcOffset = 3; 480827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org static const int kDeoptEntrySize = 4; 4809a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4810a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Simple element accessors. 4811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define DEFINE_ELEMENT_ACCESSORS(name, type) \ 4812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org type* name() { \ 4813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return type::cast(get(k##name##Index)); \ 4814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } \ 4815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void Set##name(type* value) { \ 4816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org set(k##name##Index, value); \ 4817a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 4818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4819a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DEFINE_ELEMENT_ACCESSORS(TranslationByteArray, ByteArray) 4820a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DEFINE_ELEMENT_ACCESSORS(InlinedFunctionCount, Smi) 4821a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DEFINE_ELEMENT_ACCESSORS(LiteralArray, FixedArray) 4822a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DEFINE_ELEMENT_ACCESSORS(OsrAstId, Smi) 4823a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DEFINE_ELEMENT_ACCESSORS(OsrPcOffset, Smi) 4824f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DEFINE_ELEMENT_ACCESSORS(OptimizationId, Smi) 4825f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DEFINE_ELEMENT_ACCESSORS(SharedFunctionInfo, Object) 4826a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4827a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DEFINE_ELEMENT_ACCESSORS 4828a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4829a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Accessors for elements of the ith deoptimization entry. 48306474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#define DEFINE_ENTRY_ACCESSORS(name, type) \ 48317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org type* name(int i) { \ 48327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return type::cast(get(IndexForEntry(i) + k##name##Offset)); \ 48337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } \ 48347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void Set##name(int i, type* value) { \ 48357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org set(IndexForEntry(i) + k##name##Offset, value); \ 48367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 48377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 48386474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DEFINE_ENTRY_ACCESSORS(AstIdRaw, Smi) 48396474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DEFINE_ENTRY_ACCESSORS(TranslationIndex, Smi) 48406474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DEFINE_ENTRY_ACCESSORS(ArgumentsStackHeight, Smi) 48416474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DEFINE_ENTRY_ACCESSORS(Pc, Smi) 48427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 48437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef DEFINE_DEOPT_ENTRY_ACCESSORS 48447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4845471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId AstId(int i) { 4846471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return BailoutId(AstIdRaw(i)->value()); 4847471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 4848471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 4849471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org void SetAstId(int i, BailoutId value) { 4850471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org SetAstIdRaw(i, Smi::FromInt(value.ToInt())); 4851471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 4852471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 4853a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int DeoptCount() { 48546474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return (length() - kFirstDeoptEntryIndex) / kDeoptEntrySize; 4855a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 4856a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4857a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Allocates a DeoptimizationInputData. 48583484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org static Handle<DeoptimizationInputData> New(Isolate* isolate, 48593484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int deopt_entry_count, 48603484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org PretenureFlag pretenure); 4861a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4862975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(DeoptimizationInputData) 4863a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 48644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#ifdef ENABLE_DISASSEMBLER 4865f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void DeoptimizationInputDataPrint(OStream& os); // NOLINT 4866a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif 4867a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4868a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private: 4869a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static int IndexForEntry(int i) { 4870a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return kFirstDeoptEntryIndex + (i * kDeoptEntrySize); 4871a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 4872a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 48737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 48746474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static int LengthFor(int entry_count) { return IndexForEntry(entry_count); } 4875a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}; 4876a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4877a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4878a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// DeoptimizationOutputData is a fixed array used to hold the deoptimization 4879a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// data for code generated by the full compiler. 4880a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// The format of the these objects is 4881a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// [i * 2]: Ast ID for ith deoptimization. 4882a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// [i * 2 + 1]: PC and state of ith deoptimization 4883a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass DeoptimizationOutputData: public FixedArray { 4884a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public: 4885a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int DeoptPoints() { return length() / 2; } 4886471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 4887471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId AstId(int index) { 4888471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return BailoutId(Smi::cast(get(index * 2))->value()); 4889471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 4890471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 4891471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org void SetAstId(int index, BailoutId id) { 4892471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org set(index * 2, Smi::FromInt(id.ToInt())); 4893471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 4894471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 4895a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Smi* PcAndState(int index) { return Smi::cast(get(1 + index * 2)); } 4896a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void SetPcAndState(int index, Smi* offset) { set(1 + index * 2, offset); } 4897a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4898a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static int LengthOfFixedArray(int deopt_points) { 4899a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return deopt_points * 2; 4900a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 4901a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4902a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Allocates a DeoptimizationOutputData. 49033484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org static Handle<DeoptimizationOutputData> New(Isolate* isolate, 49043484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int number_of_deopt_points, 49053484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org PretenureFlag pretenure); 4906a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4907975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(DeoptimizationOutputData) 4908a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 49097b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org#if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) 4910f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void DeoptimizationOutputDataPrint(OStream& os); // NOLINT 4911a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif 4912a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}; 4913a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4914a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4915fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org// Forward declaration. 491641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgclass Cell; 4917b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgclass PropertyCell; 4918fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgclass SafepointEntry; 4919f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgclass TypeFeedbackInfo; 4920c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 492143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Code describes objects with on-the-fly generated machine code. 492243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Code: public HeapObject { 492343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 492443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Opaque data type for encapsulating code flags like kind, inline 492543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // cache state, and arguments count. 49264c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org typedef uint32_t Flags; 492743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define NON_IC_KIND_LIST(V) \ 49291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(FUNCTION) \ 49301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(OPTIMIZED_FUNCTION) \ 49311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(STUB) \ 493232aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org V(HANDLER) \ 49331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(BUILTIN) \ 49341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(REGEXP) 49351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 49361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define IC_KIND_LIST(V) \ 49371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(LOAD_IC) \ 49381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(KEYED_LOAD_IC) \ 4939a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org V(CALL_IC) \ 49401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(STORE_IC) \ 49411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(KEYED_STORE_IC) \ 49421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(BINARY_OP_IC) \ 49431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(COMPARE_IC) \ 49441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(COMPARE_NIL_IC) \ 4945753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org V(TO_BOOLEAN_IC) 4946753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org 49471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_KIND_LIST(V) \ 49481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NON_IC_KIND_LIST(V) \ 49491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org IC_KIND_LIST(V) 49501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 495143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen enum Kind { 4952753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#define DEFINE_CODE_KIND_ENUM(name) name, 4953753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org CODE_KIND_LIST(DEFINE_CODE_KIND_ENUM) 4954753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#undef DEFINE_CODE_KIND_ENUM 49551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NUMBER_OF_KINDS 495643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 495743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4958753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org // No more than 16 kinds. The value is currently encoded in four bits in 4959753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org // Flags. 49601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT(NUMBER_OF_KINDS <= 16); 4961753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org 4962a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static const char* Kind2String(Kind kind); 4963a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 49647a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org // Types of stubs. 49657a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org enum StubType { 49667a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org NORMAL, 49679af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org FAST 49687a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org }; 49697a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org 4970c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org static const int kPrologueOffsetNotSet = -1; 4971c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 4972769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com#ifdef ENABLE_DISASSEMBLER 4973769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com // Printing 4974b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org static const char* ICState2String(InlineCacheState state); 49757a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org static const char* StubType2String(StubType type); 4976f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org static void PrintExtraICState(OStream& os, // NOLINT 4977f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org Kind kind, ExtraICState extra); 4978f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void Disassemble(const char* name, OStream& os); // NOLINT 4979769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com#endif // ENABLE_DISASSEMBLER 498043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 498143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [instruction_size]: Size of the native instructions 49824b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int instruction_size() const; 498343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_instruction_size(int value); 498443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49854a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com // [relocation_info]: Code relocation information 49864a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com DECL_ACCESSORS(relocation_info, ByteArray) 4987a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void InvalidateRelocation(); 4988f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org void InvalidateEmbeddedObjects(); 49894a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 499004e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org // [handler_table]: Fixed array containing offsets of exception handlers. 499104e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org DECL_ACCESSORS(handler_table, FixedArray) 499204e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org 4993a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // [deoptimization_data]: Array containing data for deopt. 4994a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DECL_ACCESSORS(deoptimization_data, FixedArray) 4995a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4996057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // [raw_type_feedback_info]: This field stores various things, depending on 4997057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // the kind of the code object. 49983d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // FUNCTION => type feedback information. 49999d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // STUB and ICs => major/minor key as Smi. 5000057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org DECL_ACCESSORS(raw_type_feedback_info, Object) 5001057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org inline Object* type_feedback_info(); 5002057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org inline void set_type_feedback_info( 5003057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Object* value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 50049d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org inline uint32_t stub_key(); 50059d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org inline void set_stub_key(uint32_t key); 5006fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org 50073d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // [next_code_link]: Link for lists of optimized or deoptimized code. 50083d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Note that storage for this field is overlapped with typefeedback_info. 50093d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org DECL_ACCESSORS(next_code_link, Object) 5010fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5011659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // [gc_metadata]: Field used to hold GC related metadata. The contents of this 50127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // field does not have to be traced during garbage collection since 50137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // it is only used by the garbage collector itself. 5014659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org DECL_ACCESSORS(gc_metadata, Object) 50157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 501688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // [ic_age]: Inline caching age: the value of the Heap::global_ic_age 501788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // at the moment when this object was created. 501888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org inline void set_ic_age(int count); 50194b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int ic_age() const; 502088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org 502183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // [prologue_offset]: Offset of the function prologue, used for aging 502283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // FUNCTIONs and OPTIMIZED_FUNCTIONs. 50234b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int prologue_offset() const; 502483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org inline void set_prologue_offset(int offset); 502583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 5026a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Unchecked accessors to be used during GC. 50274a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com inline ByteArray* unchecked_relocation_info(); 50284a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 502943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int relocation_size(); 503043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 503143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [flags]: Various code flags. 503243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Flags flags(); 503343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_flags(Flags flags); 503443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 503543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [flags]: Access to specific code flags. 503643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Kind kind(); 503771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org inline InlineCacheState ic_state(); // Only valid for IC stubs. 50380511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com inline ExtraICState extra_ic_state(); // Only valid for IC stubs. 5039b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org 50407a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org inline StubType type(); // Only valid for monomorphic IC stubs. 504143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 504243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Testers for IC stub kinds. 504343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_inline_cache_stub(); 5044ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org inline bool is_debug_stub(); 5045fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org inline bool is_handler() { return kind() == HANDLER; } 504643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_load_stub() { return kind() == LOAD_IC; } 504743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_keyed_load_stub() { return kind() == KEYED_LOAD_IC; } 504843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_store_stub() { return kind() == STORE_IC; } 504943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; } 5050a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org inline bool is_call_stub() { return kind() == CALL_IC; } 50519fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; } 5052a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; } 5053ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org inline bool is_compare_nil_ic_stub() { return kind() == COMPARE_NIL_IC; } 50549fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org inline bool is_to_boolean_ic_stub() { return kind() == TO_BOOLEAN_IC; } 5055fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org inline bool is_keyed_stub(); 5056f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org inline bool is_optimized_code() { return kind() == OPTIMIZED_FUNCTION; } 50572ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline bool is_weak_stub(); 50582ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline void mark_as_weak_stub(); 50592ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline bool is_invalidated_weak_stub(); 50602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline void mark_as_invalidated_weak_stub(); 50612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 50622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline bool CanBeWeakStub() { 50632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Kind k = kind(); 50642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return (k == LOAD_IC || k == STORE_IC || k == KEYED_LOAD_IC || 50652ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org k == KEYED_STORE_IC || k == COMPARE_NIL_IC) && 50662ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org ic_state() == MONOMORPHIC; 50672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 506843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org inline bool IsCodeStubOrIC(); 50709d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 5071113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org inline void set_raw_kind_specific_flags1(int value); 5072113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org inline void set_raw_kind_specific_flags2(int value); 5073113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org 50747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // [is_crankshafted]: For kind STUB or ICs, tells whether or not a code 50757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // object was generated by either the hydrogen or the TurboFan optimizing 50767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // compiler (but it may not be an optimized function). 50777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org inline bool is_crankshafted(); 50787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org inline bool is_hydrogen_stub(); // Crankshafted, but not a function. 5079b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org inline void set_is_crankshafted(bool value); 5080b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org 50817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // [is_turbofanned]: For kind STUB or OPTIMIZED_FUNCTION, tells whether the 50827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // code object was generated by the TurboFan optimizing compiler. 50837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org inline bool is_turbofanned(); 50847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org inline void set_is_turbofanned(bool value); 50857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5086a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // [optimizable]: For FUNCTION kind, tells if it is optimizable. 5087a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline bool optimizable(); 5088a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline void set_optimizable(bool value); 5089a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5090a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // [has_deoptimization_support]: For FUNCTION kind, tells if it has 5091a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // deoptimization support. 5092a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline bool has_deoptimization_support(); 5093a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline void set_has_deoptimization_support(bool value); 5094a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 509534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // [has_debug_break_slots]: For FUNCTION kind, tells if it has 509634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // been compiled with debug break slots. 509734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org inline bool has_debug_break_slots(); 509834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org inline void set_has_debug_break_slots(bool value); 509934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 5100394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // [compiled_with_optimizing]: For FUNCTION kind, tells if it has 5101394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // been compiled with IsOptimizing set to true. 5102394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com inline bool is_compiled_optimizable(); 5103394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com inline void set_compiled_optimizable(bool value); 5104394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 5105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // [allow_osr_at_loop_nesting_level]: For FUNCTION kind, tells for 5106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // how long the function has been marked for OSR and therefore which 5107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // level of loop nesting we are willing to do on-stack replacement 5108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // for. 5109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline void set_allow_osr_at_loop_nesting_level(int level); 5110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline int allow_osr_at_loop_nesting_level(); 5111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 51121456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org // [profiler_ticks]: For FUNCTION kind, tells for how many profiler ticks 51131456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org // the code object was seen on the stack with no IC patching going on. 51141456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org inline int profiler_ticks(); 51151456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org inline void set_profiler_ticks(int ticks); 51161456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 51174c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // [builtin_index]: For BUILTIN kind, tells which builtin index it has. 51184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org inline int builtin_index(); 51194c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org inline void set_builtin_index(int id); 51204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 5121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // [stack_slots]: For kind OPTIMIZED_FUNCTION, the number of stack slots 5122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // reserved in the code prologue. 5123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline unsigned stack_slots(); 5124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline void set_stack_slots(unsigned slots); 5125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 51267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // [safepoint_table_start]: For kind OPTIMIZED_FUNCTION, the offset in 5127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // the instruction stream where the safepoint table starts. 512883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org inline unsigned safepoint_table_offset(); 512983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org inline void set_safepoint_table_offset(unsigned offset); 5130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5131e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // [back_edge_table_start]: For kind FUNCTION, the offset in the 5132e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // instruction stream where the back edge table starts. 5133e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org inline unsigned back_edge_table_offset(); 5134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org inline void set_back_edge_table_offset(unsigned offset); 5135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5136e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org inline bool back_edges_patched_for_osr(); 51376e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 51389fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org // [to_boolean_foo]: For kind TO_BOOLEAN_IC tells what state the stub is in. 51399fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org inline byte to_boolean_state(); 51409fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org 5141fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // [has_function_cache]: For kind STUB tells whether there is a function 5142fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // cache is passed to the stub. 5143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline bool has_function_cache(); 5144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void set_has_function_cache(bool flag); 5145c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 5146003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 5147003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // [marked_for_deoptimization]: For kind OPTIMIZED_FUNCTION tells whether 5148003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // the code is going to be deoptimized because of dead embedded maps. 5149003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org inline bool marked_for_deoptimization(); 5150003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org inline void set_marked_for_deoptimization(bool flag); 5151003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 51529ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org // [constant_pool]: The constant pool for this function. 51539ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org inline ConstantPoolArray* constant_pool(); 51549ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org inline void set_constant_pool(Object* constant_pool); 51559ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org 5156c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Get the safepoint entry for the given pc. 5157c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org SafepointEntry GetSafepointEntry(Address pc); 5158a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 51591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Find an object in a stub with a specified map 51601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Object* FindNthObject(int n, Map* match_map); 51611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 51620f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org // Find the first allocation site in an IC stub. 51630f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org AllocationSite* FindFirstAllocationSite(); 51640f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 5165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Find the first map in an IC stub. 5166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Map* FindFirstMap(); 51674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org void FindAllMaps(MapHandleList* maps); 51684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 516932aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org // Find the first handler in an IC stub. 517032aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org Code* FindFirstHandler(); 517132aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org 517232aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org // Find |length| handlers and put them into |code_list|. Returns false if not 517332aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org // enough handlers can be found. 51742efc3e46d2de48d8859520ee7fe035c02108509bmstarzinger@chromium.org bool FindHandlers(CodeHandleList* code_list, int length = -1); 51757276f14ca716596e0a0d17539516370c1f453847kasper.lund 5176474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // Find the handler for |map|. 5177474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org MaybeHandle<Code> FindHandlerForMap(Map* map); 5178474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 517957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // Find the first name in an IC stub. 518057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Name* FindFirstName(); 518157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 51829801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org class FindAndReplacePattern; 51839801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org // For each (map-to-find, object-to-replace) pair in the pattern, this 51849801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org // function replaces the corresponding placeholder in the code with the 51859801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org // object-to-replace. The function assumes that pairs in the pattern come in 51869801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org // the same order as the placeholders in the code. 51879801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org void FindAndReplace(const FindAndReplacePattern& pattern); 51881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5189057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // The entire code object including its header is copied verbatim to the 5190057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // snapshot so that it can be written in one, fast, memcpy during 5191057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // deserialization. The deserializer will overwrite some pointers, rather 5192057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // like a runtime linker, but the random allocation addresses used in the 5193057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // mksnapshot process would still be present in the unlinked snapshot data, 5194057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // which would make snapshot production non-reproducible. This method wipes 5195057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // out the to-be-overwritten header data for reproducible snapshots. 5196057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org inline void WipeOutHeader(); 5197057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 519843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Flags operations. 51990511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com static inline Flags ComputeFlags( 5200474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Kind kind, InlineCacheState ic_state = UNINITIALIZED, 5201474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org ExtraICState extra_ic_state = kNoExtraICState, StubType type = NORMAL, 5202474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org CacheHolderFlag holder = kCacheOnReceiver); 520343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 520471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static inline Flags ComputeMonomorphicFlags( 5205474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Kind kind, ExtraICState extra_ic_state = kNoExtraICState, 5206474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org CacheHolderFlag holder = kCacheOnReceiver, StubType type = NORMAL); 5207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 5208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static inline Flags ComputeHandlerFlags( 5209474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Kind handler_kind, StubType type = NORMAL, 5210474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org CacheHolderFlag holder = kCacheOnReceiver); 521143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52127276f14ca716596e0a0d17539516370c1f453847kasper.lund static inline InlineCacheState ExtractICStateFromFlags(Flags flags); 52137a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org static inline StubType ExtractTypeFromFlags(Flags flags); 5214474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org static inline CacheHolderFlag ExtractCacheHolderFromFlags(Flags flags); 521583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org static inline Kind ExtractKindFromFlags(Flags flags); 521683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags); 521783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 521843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline Flags RemoveTypeFromFlags(Flags flags); 5219474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org static inline Flags RemoveTypeAndHolderFromFlags(Flags flags); 522043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52218bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Convert a target address into a code object. 52228bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org static inline Code* GetCodeFromTargetAddress(Address address); 522343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5224145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com // Convert an entry address into an object. 5225145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com static inline Object* GetObjectFromEntryAddress(Address location_of_address); 5226145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com 522743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the address of the first instruction. 522843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline byte* instruction_start(); 522943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52304a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com // Returns the address right after the last instruction. 52314a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com inline byte* instruction_end(); 52324a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 523343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the size of the instructions, padding, and relocation information. 523443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int body_size(); 523543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 523643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the address of the first relocation info (read backwards!). 523743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline byte* relocation_start(); 523843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 523943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Code entry point. 524043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline byte* entry(); 524143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 524243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns true if pc is inside this object's instructions. 524343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool contains(byte* pc); 524443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 524543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Relocate the code by delta bytes. Called to signal that this code 524643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // object has been moved by delta bytes. 5247c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org void Relocate(intptr_t delta); 524843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 524943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Migrate code described by desc. 525043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void CopyFrom(const CodeDesc& desc); 525143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52526a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org // Returns the object size for a given body (used for allocation). 52536a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org static int SizeFor(int body_size) { 5254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_SIZE_TAG_ALIGNED(body_size); 52556a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org return RoundUp(kHeaderSize + body_size, kCodeAlignment); 525643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 525743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52587be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Calculate the size of the code object to report for log events. This takes 52597be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // the layout of the code object into account. 52607be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org int ExecutableSize() { 52617be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Check that the assumptions about the layout of the code object holds. 5262e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(static_cast<int>(instruction_start() - address()), 5263a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org Code::kHeaderSize); 52647be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org return instruction_size() + Code::kHeaderSize; 52657be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org } 52667be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 526743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Locating source position. 526843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int SourcePosition(Address pc); 526943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int SourceStatementPosition(Address pc); 527043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5271975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Code) 527243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 527343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 52746a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org int CodeSize() { return SizeFor(body_size()); } 5275ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org inline void CodeIterateBody(ObjectVisitor* v); 5276ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 5277ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<typename StaticVisitor> 5278ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void CodeIterateBody(Heap* heap); 5279a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 5280a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(Code) 5281c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(Code) 5282c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 52831456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org void ClearInlineCaches(); 5284e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org void ClearInlineCaches(Kind kind); 5285e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 52863d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset); 52874954674151afa960af66efb4831df06bde727333yangguo@chromium.org uint32_t TranslateAstIdToPcOffset(BailoutId ast_id); 52883d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 5289e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org#define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge, 5290e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org enum Age { 5291c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org kNotExecutedCodeAge = -2, 5292c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org kExecutedOnceCodeAge = -1, 5293e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org kNoAgeCodeAge = 0, 5294e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org CODE_AGE_LIST(DECLARE_CODE_AGE_ENUM) 5295e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kAfterLastCodeAge, 5296057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org kFirstCodeAge = kNotExecutedCodeAge, 5297e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kLastCodeAge = kAfterLastCodeAge - 1, 5298057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org kCodeAgeCount = kAfterLastCodeAge - kNotExecutedCodeAge - 1, 5299c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org kIsOldCodeAge = kSexagenarianCodeAge, 5300c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org kPreAgedCodeAge = kIsOldCodeAge - 1 5301e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org }; 5302e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org#undef DECLARE_CODE_AGE_ENUM 5303e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 53041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Code aging. Indicates how many full GCs this code has survived without 53051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // being entered through the prologue. Used to determine when it is 53061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // relatively safe to flush this code object and replace it with the lazy 53071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // compilation stub. 5308528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static void MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate); 5309c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org static void MarkCodeAsExecuted(byte* sequence, Isolate* isolate); 5310e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org void MakeOlder(MarkingParity); 53115924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org static bool IsYoungSequence(Isolate* isolate, byte* sequence); 5312e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org bool IsOld(); 5313c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org Age GetAge(); 5314057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Gets the raw code age, including psuedo code-age values such as 5315057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // kNotExecutedCodeAge and kExecutedOnceCodeAge. 5316057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Age GetRawAge(); 5317c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org static inline Code* GetPreAgedCodeAgeStub(Isolate* isolate) { 5318c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return GetCodeAgeStub(isolate, kNotExecutedCodeAge, NO_MARKING_PARITY); 5319c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } 5320e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 5321e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org void PrintDeoptLocation(FILE* out, int bailout_id); 5322c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org bool CanDeoptAt(Address pc); 5323a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 532494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP 532525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org void VerifyEmbeddedObjectsDependency(); 532694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif 532794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 53282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline bool CanContainWeakObjects() { 53292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return is_optimized_code() || is_weak_stub(); 53302ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 53312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 5332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org inline bool IsWeakObject(Object* object) { 53337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return (is_optimized_code() && !is_turbofanned() && 53347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org IsWeakObjectInOptimizedCode(object)) || 53352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org (is_weak_stub() && IsWeakObjectInIC(object)); 5336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 5337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 53389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline bool IsWeakObjectInOptimizedCode(Object* object); 53392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static inline bool IsWeakObjectInIC(Object* object); 534025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 5341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Max loop nesting marker used to postpose OSR. We don't take loop 5342a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // nesting that is deeper than 5 levels into account. 5343a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const int kMaxLoopNestingMarker = 6; 5344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 534543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 5346236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kInstructionSizeOffset = HeapObject::kHeaderSize; 53474a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com static const int kRelocationInfoOffset = kInstructionSizeOffset + kIntSize; 534804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize; 5349a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const int kDeoptimizationDataOffset = 535004e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org kHandlerTableOffset + kPointerSize; 53519d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // For FUNCTION kind, we store the type feedback info here. 5352f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org static const int kTypeFeedbackInfoOffset = 5353fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org kDeoptimizationDataOffset + kPointerSize; 5354895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org static const int kNextCodeLinkOffset = kTypeFeedbackInfoOffset + kPointerSize; 5355895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org static const int kGCMetadataOffset = kNextCodeLinkOffset + kPointerSize; 535688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org static const int kICAgeOffset = 535788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org kGCMetadataOffset + kPointerSize; 535888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org static const int kFlagsOffset = kICAgeOffset + kIntSize; 535981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kKindSpecificFlags1Offset = kFlagsOffset + kIntSize; 536081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kKindSpecificFlags2Offset = 536181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kKindSpecificFlags1Offset + kIntSize; 536283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // Note: We might be able to squeeze this into the flags above. 536383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize; 53649ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org static const int kConstantPoolOffset = kPrologueOffset + kPointerSize; 5365a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 53669ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org static const int kHeaderPaddingStart = kConstantPoolOffset + kIntSize; 5367a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 536871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Add padding to align the instruction start following right after 5369061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org // the Code object header. 537071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static const int kHeaderSize = 5371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; 53727276f14ca716596e0a0d17539516370c1f453847kasper.lund 537381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // Byte offsets within kKindSpecificFlags1Offset. 537481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kOptimizableOffset = kKindSpecificFlags1Offset; 537534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 537634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kFullCodeFlags = kOptimizableOffset + 1; 537734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org class FullCodeFlagsHasDeoptimizationSupportField: 537834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org public BitField<bool, 0, 1> {}; // NOLINT 537934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; 5380394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com class FullCodeFlagsIsCompiledOptimizable: public BitField<bool, 2, 1> {}; 5381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 538208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org static const int kProfilerTicksOffset = kFullCodeFlags + 1; 5383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 538483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org // Flags layout. BitField<type, shift, size>. 53858640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org class ICStateField : public BitField<InlineCacheState, 0, 4> {}; 53868640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org class TypeField : public BitField<StubType, 4, 1> {}; 53878640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org class CacheHolderField : public BitField<CacheHolderFlag, 5, 2> {}; 53888640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org class KindField : public BitField<Kind, 7, 4> {}; 5389f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org class ExtraICStateField: public BitField<ExtraICState, 11, 5390cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org PlatformSmiTagging::kSmiValueSize - 11 + 1> {}; // NOLINT 539171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 539281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION) 539381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kStackSlotsFirstBit = 0; 539481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kStackSlotsBitCount = 24; 53957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static const int kHasFunctionCacheBit = 539681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kStackSlotsFirstBit + kStackSlotsBitCount; 53977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static const int kMarkedForDeoptimizationBit = kHasFunctionCacheBit + 1; 53987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static const int kWeakStubBit = kMarkedForDeoptimizationBit + 1; 53997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static const int kInvalidatedWeakStubBit = kWeakStubBit + 1; 54007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static const int kIsTurbofannedBit = kInvalidatedWeakStubBit + 1; 540181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 540281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32); 54037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org STATIC_ASSERT(kIsTurbofannedBit + 1 <= 32); 540481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 540581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org class StackSlotsField: public BitField<int, 540681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kStackSlotsFirstBit, kStackSlotsBitCount> {}; // NOLINT 54077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class HasFunctionCacheField : public BitField<bool, kHasFunctionCacheBit, 1> { 54087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org }; // NOLINT 54097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class MarkedForDeoptimizationField 54107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : public BitField<bool, kMarkedForDeoptimizationBit, 1> {}; // NOLINT 54117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class WeakStubField : public BitField<bool, kWeakStubBit, 1> {}; // NOLINT 54127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class InvalidatedWeakStubField 54137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : public BitField<bool, kInvalidatedWeakStubBit, 1> {}; // NOLINT 54147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class IsTurbofannedField : public BitField<bool, kIsTurbofannedBit, 1> { 54157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org }; // NOLINT 541681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 5417b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org // KindSpecificFlags2 layout (ALL) 5418b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org static const int kIsCrankshaftedBit = 0; 5419b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org class IsCrankshaftedField: public BitField<bool, 5420b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org kIsCrankshaftedBit, 1> {}; // NOLINT 5421b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org 542281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // KindSpecificFlags2 layout (STUB and OPTIMIZED_FUNCTION) 54239d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org static const int kSafepointTableOffsetFirstBit = kIsCrankshaftedBit + 1; 5424113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org static const int kSafepointTableOffsetBitCount = 24; 542581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 542681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org STATIC_ASSERT(kSafepointTableOffsetFirstBit + 542781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kSafepointTableOffsetBitCount <= 32); 54289d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org STATIC_ASSERT(1 + kSafepointTableOffsetBitCount <= 32); 542981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 543081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org class SafepointTableOffsetField: public BitField<int, 543181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kSafepointTableOffsetFirstBit, 543281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kSafepointTableOffsetBitCount> {}; // NOLINT 543381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 543481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // KindSpecificFlags2 layout (FUNCTION) 5435b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org class BackEdgeTableOffsetField: public BitField<int, 543608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org kIsCrankshaftedBit + 1, 27> {}; // NOLINT 543708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org class AllowOSRAtLoopNestingLevelField: public BitField<int, 543808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org kIsCrankshaftedBit + 1 + 27, 4> {}; // NOLINT 543908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org STATIC_ASSERT(AllowOSRAtLoopNestingLevelField::kMax >= kMaxLoopNestingMarker); 544081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 5441f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static const int kArgumentsBits = 16; 5442876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org static const int kMaxArguments = (1 << kArgumentsBits) - 1; 544343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54441145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org // This constant should be encodable in an ARM instruction. 544571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static const int kFlagsNotUsedInLookup = 544634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org TypeField::kMask | CacheHolderField::kMask; 544743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 544843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 5449e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org friend class RelocIterator; 5450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org friend class Deoptimizer; // For FindCodeAgeSequence. 5451e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 5452e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org void ClearInlineCaches(Kind* kind); 5453e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 5454e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // Code aging 5455e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org byte* FindCodeAgeSequence(); 545641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void GetCodeAgeAndParity(Code* code, Age* age, 545741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org MarkingParity* parity); 54585924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org static void GetCodeAgeAndParity(Isolate* isolate, byte* sequence, Age* age, 5459e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org MarkingParity* parity); 5460528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static Code* GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity); 5461e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 5462e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // Code aging -- platform-specific 5463528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static void PatchPlatformCodeAge(Isolate* isolate, 5464528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org byte* sequence, Age age, 5465e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org MarkingParity parity); 5466e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 546743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(Code); 546843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 546943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 547043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 547141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgclass CompilationInfo; 547241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 5473003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// This class describes the layout of dependent codes array of a map. The 54742e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// array is partitioned into several groups of dependent codes. Each group 54752e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// contains codes with the same dependency on the map. The array has the 54762e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// following layout for n dependency groups: 54772e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// 54782e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// +----+----+-----+----+---------+----------+-----+---------+-----------+ 54792e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// | C1 | C2 | ... | Cn | group 1 | group 2 | ... | group n | undefined | 54802e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// +----+----+-----+----+---------+----------+-----+---------+-----------+ 54812e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// 54822e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// The first n elements are Smis, each of them specifies the number of codes 54832e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// in the corresponding group. The subsequent elements contain grouped code 54842e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// objects. The suffix of the array can be filled with the undefined value if 54852e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// the number of codes is less than the length of the array. The order of the 54862e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// code objects within a group is not preserved. 54872e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// 54882e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// All code indexes used in the class are counted starting from the first 54892e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// code object of the first group. In other words, code index 0 corresponds 54902e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org// to array index n = kCodesStartIndex. 54912e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 54922e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgclass DependentCode: public FixedArray { 5493003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org public: 54942e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org enum DependencyGroup { 54952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Group of IC stubs that weakly embed this map and depend on being 54962ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // invalidated when the map is garbage collected. Dependent IC stubs form 54972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // a linked list. This group stores only the head of the list. This means 54982ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // that the number_of_entries(kWeakICGroup) is 0 or 1. 54992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org kWeakICGroup, 55002e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // Group of code that weakly embed this map and depend on being 55012e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // deoptimized when the map is garbage collected. 55022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org kWeakCodeGroup, 5503f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org // Group of code that embed a transition to this map, and depend on being 5504f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org // deoptimized when the transition is replaced by a new version. 5505f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org kTransitionGroup, 55062e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // Group of code that omit run-time prototype checks for prototypes 55072e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // described by this map. The group is deoptimized whenever an object 55082e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // described by this map changes shape (and transitions to a new map), 55092e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // possibly invalidating the assumptions embedded in the code. 55102e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org kPrototypeCheckGroup, 5511906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Group of code that depends on elements not being added to objects with 5512906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // this map. 5513906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org kElementsCantBeAddedGroup, 55141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Group of code that depends on global property values in property cells 55151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // not being changed. 55161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kPropertyCellChangedGroup, 5517e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // Group of code that omit run-time type checks for the field(s) introduced 5518e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // by this map. 5519e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org kFieldTypeGroup, 5520011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Group of code that omit run-time type checks for initial maps of 5521011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // constructors. 5522011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org kInitialMapChangedGroup, 5523b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Group of code that depends on tenuring information in AllocationSites 5524b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // not being changed. 5525b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org kAllocationSiteTenuringChangedGroup, 5526b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Group of code that depends on element transition information in 5527b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // AllocationSites not being changed. 55286474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org kAllocationSiteTransitionChangedGroup 55292e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org }; 55302e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 55316474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org static const int kGroupCount = kAllocationSiteTransitionChangedGroup + 1; 55326474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 55332e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // Array for holding the index of the first code object of each group. 55342e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // The last element stores the total number of code objects. 55352e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org class GroupStartIndexes { 55362e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org public: 55372e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org explicit GroupStartIndexes(DependentCode* entries); 55382e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org void Recompute(DependentCode* entries); 55392e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org int at(int i) { return start_indexes_[i]; } 55402e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org int number_of_entries() { return start_indexes_[kGroupCount]; } 55412e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org private: 55422e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org int start_indexes_[kGroupCount + 1]; 55432e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org }; 55442e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 55452e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org bool Contains(DependencyGroup group, Code* code); 55462e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org static Handle<DependentCode> Insert(Handle<DependentCode> entries, 554741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org DependencyGroup group, 554841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Handle<Object> object); 554941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org void UpdateToFinishedCode(DependencyGroup group, 555041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org CompilationInfo* info, 555141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Code* code); 555241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org void RemoveCompilationInfo(DependentCode::DependencyGroup group, 555341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org CompilationInfo* info); 555441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 5555876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org void DeoptimizeDependentCodeGroup(Isolate* isolate, 5556876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org DependentCode::DependencyGroup group); 55572e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 55585c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org bool MarkCodeForDeoptimization(Isolate* isolate, 55595c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org DependentCode::DependencyGroup group); 55602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org void AddToDependentICList(Handle<Code> stub); 55615c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 55622e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // The following low-level accessors should only be used by this class 55632e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // and the mark compact collector. 55642e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org inline int number_of_entries(DependencyGroup group); 55652e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org inline void set_number_of_entries(DependencyGroup group, int value); 556641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline bool is_code_at(int i); 5567003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org inline Code* code_at(int i); 556841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline CompilationInfo* compilation_info_at(int i); 556941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline void set_object_at(int i, Object* object); 557041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline Object** slot_at(int i); 557141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline Object* object_at(int i); 557241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline void clear_at(int i); 557341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline void copy(int from, int to); 5574975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(DependentCode) 55752e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 55761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static DependentCode* ForObject(Handle<HeapObject> object, 55771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependencyGroup group); 55781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 55795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org static const char* DependencyGroupName(DependencyGroup group); 55805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org static void SetMarkedForDeoptimization(Code* code, DependencyGroup group); 55815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 5582003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org private: 55832e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // Make a room at the end of the given group by moving out the first 55842e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org // code objects of the subsequent groups. 55852e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org inline void ExtendGroup(DependencyGroup group); 55862e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org static const int kCodesStartIndex = kGroupCount; 5587003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}; 5588003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 5589003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 559043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All heap objects have a Map that describes their structure. 559143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A Map contains information about: 559243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Size information about the object 559343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - How to iterate over an object (for garbage collection) 559443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Map: public HeapObject { 559543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 55963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Instance size. 5597145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com // Size in bytes or kVariableSizeSentinel if instances do not have 5598145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com // a fixed size. 559943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int instance_size(); 560043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_instance_size(int value); 560143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56027c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // Count of properties allocated in the object. 56037c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org inline int inobject_properties(); 56047c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org inline void set_inobject_properties(int value); 56057c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 5606911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Count of property fields pre-allocated in the object when first allocated. 5607911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline int pre_allocated_property_fields(); 5608911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void set_pre_allocated_property_fields(int value); 5609911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 56103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Instance type. 561143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline InstanceType instance_type(); 561243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_instance_type(InstanceType value); 561343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Tells how many unused property fields are available in the 56153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // instance (only used for JSObject in fast mode). 561643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline int unused_property_fields(); 561743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_unused_property_fields(int value); 561843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Bit field. 562043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline byte bit_field(); 562143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_bit_field(byte value); 562243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56233a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org // Bit field 2. 56243a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org inline byte bit_field2(); 56253a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org inline void set_bit_field2(byte value); 56263a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org 562740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org // Bit field 3. 5628594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org inline uint32_t bit_field3(); 5629594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org inline void set_bit_field3(uint32_t bits); 563040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 5631af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org class EnumLengthBits: public BitField<int, 5632af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 0, kDescriptorIndexBitCount> {}; // NOLINT 5633af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org class NumberOfOwnDescriptorsBits: public BitField<int, 5634af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org kDescriptorIndexBitCount, kDescriptorIndexBitCount> {}; // NOLINT 5635af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org STATIC_ASSERT(kDescriptorIndexBitCount + kDescriptorIndexBitCount == 20); 563631c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class DictionaryMap : public BitField<bool, 20, 1> {}; 563731c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class OwnsDescriptors : public BitField<bool, 21, 1> {}; 563831c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class HasInstanceCallHandler : public BitField<bool, 22, 1> {}; 563931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class Deprecated : public BitField<bool, 23, 1> {}; 564031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class IsFrozen : public BitField<bool, 24, 1> {}; 564131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class IsUnstable : public BitField<bool, 25, 1> {}; 564231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class IsMigrationTarget : public BitField<bool, 26, 1> {}; 564331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org class DoneInobjectSlackTracking : public BitField<bool, 27, 1> {}; 564431c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org // Bit 28 is free. 564531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org 5646011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Keep this bit field at the very end for better code in 5647011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Builtins::kJSConstructStubGeneric stub. 5648011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org class ConstructionCount: public BitField<int, 29, 3> {}; 5649304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 565043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Tells whether the object in the prototype property will be used 565143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // for instances created from this function. If the prototype 565243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // property is set to a value that is not a JSObject, the prototype 565343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // property will not be used to create instances of the function. 565443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // See ECMA-262, 13.2.2. 565543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_non_instance_prototype(bool value); 565643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool has_non_instance_prototype(); 565743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56584111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // Tells whether function has special prototype property. If not, prototype 56594111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // property will not be created when accessed (will return undefined), 56604111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // and construction from this function will not be allowed. 56614111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org inline void set_function_with_prototype(bool value); 56624111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org inline bool function_with_prototype(); 56634111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 566443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Tells whether the instance with this map should be ignored by the 5665750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Object.getPrototypeOf() function and the __proto__ accessor. 566643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_is_hidden_prototype() { 566743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_bit_field(bit_field() | (1 << kIsHiddenPrototype)); 566843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 566943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 567043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_hidden_prototype() { 567143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return ((1 << kIsHiddenPrototype) & bit_field()) != 0; 567243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 567343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5674eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Records and queries whether the instance has a named interceptor. 567543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_has_named_interceptor() { 567643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_bit_field(bit_field() | (1 << kHasNamedInterceptor)); 567743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 567843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 567943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool has_named_interceptor() { 568043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return ((1 << kHasNamedInterceptor) & bit_field()) != 0; 568143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 568243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5683eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Records and queries whether the instance has an indexed interceptor. 568443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_has_indexed_interceptor() { 568543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_bit_field(bit_field() | (1 << kHasIndexedInterceptor)); 568643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 568743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 568843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool has_indexed_interceptor() { 568943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return ((1 << kHasIndexedInterceptor) & bit_field()) != 0; 569043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 569143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 569243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Tells whether the instance is undetectable. 569343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // An undetectable object is a special class of JSObject: 'typeof' operator 569443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // returns undefined, ToBoolean returns false. Otherwise it behaves like 569543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // a normal JS object. It is useful for implementing undetectable 569643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // document.all in Firefox & Safari. 569743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // See https://bugzilla.mozilla.org/show_bug.cgi?id=248549. 569843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_is_undetectable() { 569943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_bit_field(bit_field() | (1 << kIsUndetectable)); 570043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 570143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 570243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_undetectable() { 570343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return ((1 << kIsUndetectable) & bit_field()) != 0; 570443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 570543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 570643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Tells whether the instance has a call-as-function handler. 5707b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline void set_is_observed() { 5708b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org set_bit_field(bit_field() | (1 << kIsObserved)); 570943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 571043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5711b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline bool is_observed() { 5712b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org return ((1 << kIsObserved) & bit_field()) != 0; 571343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 571443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 571569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org inline void set_is_extensible(bool value); 571669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org inline bool is_extensible(); 57178640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org inline void set_is_prototype_map(bool value); 5718e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org inline bool is_prototype_map(); 5719b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 572083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org inline void set_elements_kind(ElementsKind elements_kind) { 5721e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(elements_kind < kElementsKindCount); 5722e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kElementsKindCount <= (1 << Map::ElementsKindBits::kSize)); 5723d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org set_bit_field2(Map::ElementsKindBits::update(bit_field2(), elements_kind)); 5724e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(this->elements_kind() == elements_kind); 572540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 572640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 572783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org inline ElementsKind elements_kind() { 5728d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return Map::ElementsKindBits::decode(bit_field2()); 572940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 573040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 5731c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Tells whether the instance has fast elements that are only Smis. 5732830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org inline bool has_fast_smi_elements() { 5733830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org return IsFastSmiElementsKind(elements_kind()); 5734c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 5735c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 57367b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // Tells whether the instance has fast elements. 5737830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org inline bool has_fast_object_elements() { 5738830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org return IsFastObjectElementsKind(elements_kind()); 5739830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org } 5740830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 5741830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org inline bool has_fast_smi_or_object_elements() { 5742830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org return IsFastSmiOrObjectElementsKind(elements_kind()); 5743496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org } 5744496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 57456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org inline bool has_fast_double_elements() { 5746830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org return IsFastDoubleElementsKind(elements_kind()); 57476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 57486d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 5749a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline bool has_fast_elements() { 5750a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return IsFastElementsKind(elements_kind()); 5751a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 5752a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 5753486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org inline bool has_sloppy_arguments_elements() { 5754486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return elements_kind() == SLOPPY_ARGUMENTS_ELEMENTS; 5755c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 5756c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 57574d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org inline bool has_external_array_elements() { 57587028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return IsExternalArrayElementsKind(elements_kind()); 5759496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org } 5760496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 57615c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org inline bool has_fixed_typed_array_elements() { 57625c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return IsFixedTypedArrayElementsKind(elements_kind()); 57635c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } 57645c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 57654f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org inline bool has_dictionary_elements() { 57667028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return IsDictionaryElementsKind(elements_kind()); 57674f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 57684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 57692efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org inline bool has_slow_elements_kind() { 57702efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org return elements_kind() == DICTIONARY_ELEMENTS 5771486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org || elements_kind() == SLOPPY_ARGUMENTS_ELEMENTS; 57722efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org } 57732efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org 5774394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static bool IsValidElementsTransition(ElementsKind from_kind, 5775394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com ElementsKind to_kind); 5776394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 5777e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Returns true if the current map doesn't have DICTIONARY_ELEMENTS but if a 5778e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // map with DICTIONARY_ELEMENTS was found in the prototype chain. 5779e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org bool DictionaryElementsInPrototypeChainOnly(); 5780e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 57814b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline bool HasTransitionArray() const; 578299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org inline bool HasElementsTransition(); 57837028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline Map* elements_transition_map(); 5784975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 578506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org inline Map* GetTransition(int transition_index); 57868f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org inline int SearchTransition(Name* name); 57875b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org inline FixedArrayBase* GetInitialElements(); 5788db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org 5789de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org DECL_ACCESSORS(transitions, TransitionArray) 5790f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 5791975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org static inline Handle<String> ExpectedTransitionKey(Handle<Map> map); 5792975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org static inline Handle<Map> ExpectedTransitionTarget(Handle<Map> map); 5793975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 5794975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // Try to follow an existing transition to a field with attributes NONE. The 5795975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // return value indicates whether the transition was successful. 5796975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org static inline Handle<Map> FindTransitionToField(Handle<Map> map, 5797975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Handle<Name> key); 5798975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 5799f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Map* FindRootMap(); 5800e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Map* FindFieldOwner(int descriptor); 5801f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 58020a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org inline int GetInObjectPropertyOffset(int index); 58030a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org 5804f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org int NumberOfFields(); 5805f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 5806975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // TODO(ishell): candidate with JSObject::MigrateToMap(). 5807f6e8ed2294f2eccae83564eead8b79ea050b9f21yangguo@chromium.org bool InstancesNeedRewriting(Map* target, int target_number_of_fields, 5808f6e8ed2294f2eccae83564eead8b79ea050b9f21yangguo@chromium.org int target_inobject, int target_unused, 5809f6e8ed2294f2eccae83564eead8b79ea050b9f21yangguo@chromium.org int* old_number_of_fields); 5810975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // TODO(ishell): moveit! 5811e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org static Handle<Map> GeneralizeAllFieldRepresentations(Handle<Map> map); 5812975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org MUST_USE_RESULT static Handle<HeapType> GeneralizeFieldType( 5813975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Handle<HeapType> type1, 5814975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Handle<HeapType> type2, 5815975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Isolate* isolate); 5816e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org static void GeneralizeFieldType(Handle<Map> map, 5817e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org int modify_index, 5818e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Handle<HeapType> new_field_type); 5819f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org static Handle<Map> GeneralizeRepresentation( 5820f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Handle<Map> map, 5821f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org int modify_index, 58229259716434187c932704601f700375e53d865de8rossberg@chromium.org Representation new_representation, 5823e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Handle<HeapType> new_field_type, 58249259716434187c932704601f700375e53d865de8rossberg@chromium.org StoreMode store_mode); 5825528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static Handle<Map> CopyGeneralizeAllRepresentations( 5826528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Handle<Map> map, 58279259716434187c932704601f700375e53d865de8rossberg@chromium.org int modify_index, 58289259716434187c932704601f700375e53d865de8rossberg@chromium.org StoreMode store_mode, 58291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org PropertyAttributes attributes, 58309259716434187c932704601f700375e53d865de8rossberg@chromium.org const char* reason); 5831e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org static Handle<Map> CopyGeneralizeAllRepresentations( 5832e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org Handle<Map> map, 5833e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org int modify_index, 5834e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org StoreMode store_mode, 5835e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org const char* reason); 5836f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 5837474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org static Handle<Map> PrepareForDataProperty(Handle<Map> old_map, 5838474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org int descriptor_number, 5839474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<Object> value); 5840474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 5841c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org static Handle<Map> Normalize(Handle<Map> map, PropertyNormalizationMode mode); 5842c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 584332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org // Returns the constructor name (the name (possibly, inferred name) of the 584432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org // function that was used to instantiate the object). 584532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org String* constructor_name(); 584632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org 584788767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com // Tells whether the map is used for JSObjects in dictionary mode (ie 584888767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com // normalized objects, ie objects for which HasFastProperties returns false). 584988767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com // A map can never be used for both dictionary mode and fast mode JSObjects. 585088767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com // False by default and for HeapObjects that are not JSObjects. 585188767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com inline void set_dictionary_map(bool value); 585288767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com inline bool is_dictionary_map(); 585388767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com 585443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Tells whether the instance needs security checks when accessing its 585543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // properties. 5856870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline void set_is_access_check_needed(bool access_check_needed); 5857870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline bool is_access_check_needed(); 585843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5859ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org // Returns true if map has a non-empty stub code cache. 5860ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org inline bool has_code_cache(); 5861ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 586243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [prototype]: implicit prototype object. 586343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(prototype, Object) 586443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 586543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [constructor]: points back to the function responsible for this map. 586643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(constructor, Object) 586743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 586843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [instance descriptors]: describes the object. 586989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org DECL_ACCESSORS(instance_descriptors, DescriptorArray) 587089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org inline void InitializeDescriptors(DescriptorArray* descriptors); 587140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 587243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [stub cache]: contains stubs compiled for this map. 5873ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org DECL_ACCESSORS(code_cache, Object) 587443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // [dependent code]: list of optimized codes that weakly embed this map. 58762e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org DECL_ACCESSORS(dependent_code, DependentCode) 5877003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 5878212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // [back pointer]: points back to the parent map from which a transition 5879212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // leads to this map. The field overlaps with prototype transitions and the 5880212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // back pointer will be moved into the prototype transitions array if 5881212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // required. 5882212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org inline Object* GetBackPointer(); 5883212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org inline void SetBackPointer(Object* value, 5884212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 588581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org inline void init_back_pointer(Object* undefined); 5886212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org 58873847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com // [prototype transitions]: cache of prototype transitions. 58883847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com // Prototype transition is a transition that happens 58893847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com // when we change object's prototype to a new one. 58903847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com // Cache format: 58913847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com // 0: finger - index of the first free cell in the cache 5892212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // 1: back pointer that overlaps with prototype transitions field. 5893212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // 2 + 2 * i: prototype 5894212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // 3 + 2 * i: target map 589581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org inline FixedArray* GetPrototypeTransitions(); 589681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org inline bool HasPrototypeTransitions(); 5897c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 589881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kProtoTransitionHeaderSize = 1; 5899d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com static const int kProtoTransitionNumberOfEntriesOffset = 0; 5900d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com static const int kProtoTransitionElementsPerEntry = 2; 5901d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com static const int kProtoTransitionPrototypeOffset = 0; 5902d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com static const int kProtoTransitionMapOffset = 1; 5903d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 5904d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com inline int NumberOfProtoTransitions() { 590581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org FixedArray* cache = GetPrototypeTransitions(); 5906d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com if (cache->length() == 0) return 0; 5907d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com return 5908d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com Smi::cast(cache->get(kProtoTransitionNumberOfEntriesOffset))->value(); 5909d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com } 5910d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 5911d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com inline void SetNumberOfProtoTransitions(int value) { 591281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org FixedArray* cache = GetPrototypeTransitions(); 5913e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cache->length() != 0); 5914b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org cache->set(kProtoTransitionNumberOfEntriesOffset, Smi::FromInt(value)); 5915d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com } 5916d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 5917a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Lookup in the map's instance descriptors and fill out the result 5918a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // with the given holder if the name is found. The holder may be 5919a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // NULL when this function is used from the compiler. 592046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline void LookupDescriptor(JSObject* holder, 5921750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Name* name, 592246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org LookupResult* result); 592399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 592446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline void LookupTransition(JSObject* holder, 5925750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Name* name, 592646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org LookupResult* result); 592799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 5928bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org inline PropertyDetails GetLastDescriptorDetails(); 5929bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org 5930b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org // The size of transition arrays are limited so they do not end up in large 5931b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org // object space. Otherwise ClearNonLiveTransitions would leak memory while 5932b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org // applying in-place right trimming. 5933b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org inline bool CanHaveMoreTransitions(); 5934b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 593546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org int LastAdded() { 593646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org int number_of_own_descriptors = NumberOfOwnDescriptors(); 5937e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(number_of_own_descriptors > 0); 593846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return number_of_own_descriptors - 1; 5939304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 5940304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 594146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org int NumberOfOwnDescriptors() { 594246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return NumberOfOwnDescriptorsBits::decode(bit_field3()); 5943304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 5944304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 594546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org void SetNumberOfOwnDescriptors(int number) { 5946e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(number <= instance_descriptors()->number_of_descriptors()); 594746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org set_bit_field3(NumberOfOwnDescriptorsBits::update(bit_field3(), number)); 5948304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 5949304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 595041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline Cell* RetrieveDescriptorsPointer(); 595106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 5952355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org int EnumLength() { 5953355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org return EnumLengthBits::decode(bit_field3()); 5954355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 5955355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 595606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org void SetEnumLength(int length) { 5957af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org if (length != kInvalidEnumCacheSentinel) { 5958e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length >= 0); 5959e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length == 0 || instance_descriptors()->HasEnumCache()); 5960e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length <= NumberOfOwnDescriptors()); 596106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org } 596206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org set_bit_field3(EnumLengthBits::update(bit_field3(), length)); 5963355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 5964355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 596506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org inline bool owns_descriptors(); 596631c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org inline void set_owns_descriptors(bool owns_descriptors); 5967b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline bool has_instance_call_handler(); 5968b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline void set_has_instance_call_handler(); 5969a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org inline void freeze(); 5970a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org inline bool is_frozen(); 5971d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org inline void mark_unstable(); 5972d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org inline bool is_stable(); 5973594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org inline void set_migration_target(bool value); 5974594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org inline bool is_migration_target(); 5975011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org inline void set_done_inobject_slack_tracking(bool value); 5976011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org inline bool done_inobject_slack_tracking(); 5977011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org inline void set_construction_count(int value); 5978011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org inline int construction_count(); 5979f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org inline void deprecate(); 5980f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org inline bool is_deprecated(); 5981f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org inline bool CanBeDeprecated(); 598257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // Returns a non-deprecated version of the input. If the input was not 598357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // deprecated, it is directly returned. Otherwise, the non-deprecated version 598457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // is found by re-transitioning from the root of the transition tree using the 5985bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org // descriptor array of the map. Returns NULL if no updated map is found. 5986113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org // This method also applies any pending migrations along the prototype chain. 5987ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org static MaybeHandle<Map> TryUpdate(Handle<Map> map) WARN_UNUSED_RESULT; 5988113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org // Same as above, but does not touch the prototype chain. 59899d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org static MaybeHandle<Map> TryUpdateInternal(Handle<Map> map) 5990ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org WARN_UNUSED_RESULT; 599106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 59929d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // Returns a non-deprecated version of the input. This method may deprecate 59939d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // existing maps along the way if encodings conflict. Not for use while 59949d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // gathering type feedback. Use TryUpdate in those cases instead. 59959d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org static Handle<Map> Update(Handle<Map> map); 59969d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 5997ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static Handle<Map> CopyDropDescriptors(Handle<Map> map); 59985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org static Handle<Map> CopyInsertDescriptor(Handle<Map> map, 59995b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Descriptor* descriptor, 60005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TransitionFlag flag); 6001895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 60029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Map> CopyWithField( 60039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Map> map, 60049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name> name, 60059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<HeapType> type, 60069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org PropertyAttributes attributes, 60079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Representation representation, 60089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TransitionFlag flag); 60099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 60109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Map> CopyWithConstant( 60119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Map> map, 60129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name> name, 60139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Object> constant, 60149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org PropertyAttributes attributes, 60159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TransitionFlag flag); 60169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6017af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org // Returns a new map with all transitions dropped from the given map and 6018af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org // the ElementsKind set. 6019af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org static Handle<Map> TransitionElementsTo(Handle<Map> map, 6020af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org ElementsKind to_kind); 6021af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org 6022895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org static Handle<Map> AsElementsKind(Handle<Map> map, ElementsKind kind); 6023895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 60245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org static Handle<Map> CopyAsElementsKind(Handle<Map> map, 60255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org ElementsKind kind, 60265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TransitionFlag flag); 6027b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org 6028b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org static Handle<Map> CopyForObserved(Handle<Map> map); 602943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<Map> CopyForFreeze(Handle<Map> map); 6031474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // Maximal number of fast properties. Used to restrict the number of map 6032474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // transitions to avoid an explosion in the number of maps for objects used as 6033474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // dictionaries. 6034474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org inline bool TooManyFastProperties(StoreFromKeyed store_mode); 6035474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org static Handle<Map> TransitionToDataProperty(Handle<Map> map, 6036474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<Name> name, 6037474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<Object> value, 6038474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org PropertyAttributes attributes, 6039474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org StoreFromKeyed store_mode); 60407dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org static Handle<Map> TransitionToAccessorProperty( 60417dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org Handle<Map> map, Handle<Name> name, AccessorComponent component, 60427dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org Handle<Object> accessor, PropertyAttributes attributes); 60435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org static Handle<Map> ReconfigureDataProperty(Handle<Map> map, int descriptor, 60445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org PropertyAttributes attributes); 60459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 60462ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline void AppendDescriptor(Descriptor* desc); 6047304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 60489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Returns a copy of the map, with all transitions dropped from the 60499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // instance descriptors. 6050c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org static Handle<Map> Copy(Handle<Map> map); 6051a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org static Handle<Map> Create(Isolate* isolate, int inobject_properties); 60529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 605343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the next free property index (only valid for FAST MODE). 605443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int NextFreePropertyIndex(); 605543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6056ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // Returns the number of properties described in instance_descriptors 6057ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // filtering out properties with the specified attributes. 605806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org int NumberOfDescribedProperties(DescriptorFlag which = OWN_DESCRIPTORS, 605906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org PropertyAttributes filter = NONE); 606043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 606110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // Returns the number of slots allocated for the initial properties 606210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org // backing storage for instances of this map. 606310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org int InitialPropertiesLength() { 606410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org return pre_allocated_property_fields() + unused_property_fields() - 606510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org inobject_properties(); 606610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org } 606710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 6068975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Map) 606943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 607043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Code cache operations. 607143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 607243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Clears the code cache. 6073ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void ClearCodeCache(Heap* heap); 607443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 607543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Update code cache. 6076394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static void UpdateCodeCache(Handle<Map> map, 6077750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<Name> name, 6078394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<Code> code); 607943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6080129d398d682e6ca3910808c913212ce532f1e155danno@chromium.org // Extend the descriptor array of the map with the list of descriptors. 6081129d398d682e6ca3910808c913212ce532f1e155danno@chromium.org // In case of duplicates, the latest descriptor is used. 608233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static void AppendCallbackDescriptors(Handle<Map> map, 608333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Handle<Object> descriptors); 608433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 608533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static void EnsureDescriptorSlack(Handle<Map> map, int slack); 6086129d398d682e6ca3910808c913212ce532f1e155danno@chromium.org 608743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the found code or undefined if absent. 6088750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Object* FindInCodeCache(Name* name, Code::Flags flags); 608943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6090b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Returns the non-negative index of the code object if it is in the 6091b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // cache and -1 otherwise. 609299a37fa2988524a4a6deafb9f83a58304935af6fsgjesse@chromium.org int IndexInCodeCache(Object* name, Code* code); 6093b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 6094b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Removes a code object from the code cache at the given index. 6095750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org void RemoveFromCodeCache(Name* name, Code* code, int index); 609643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6097212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // Set all map transitions from this map to dead maps to null. Also clear 6098212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // back pointers in transition targets so that we do not process this map 6099212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org // again while following back pointers. 6100212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org void ClearNonLiveTransitions(Heap* heap); 6101fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 6102e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org // Computes a hash value for this map, to be used in HashTables and such. 6103e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org int Hash(); 6104e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 6105b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // Returns the map that this map transitions to if its elements_kind 6106b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // is changed to |elements_kind|, or NULL if no such map is cached yet. 6107b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // |safe_to_add_transitions| is set to false if adding transitions is not 6108b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // allowed. 61097028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org Map* LookupElementsTransitionMap(ElementsKind elements_kind); 6110b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 6111394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Returns the transitioned map for this map with the most generic 6112394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // elements_kind that's found in |candidates|, or null handle if no match is 6113394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // found at all. 6114394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<Map> FindTransitionedMap(MapHandleList* candidates); 6115394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 6116003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org bool CanTransition() { 6117003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Only JSObject and subtypes have map transitions and back pointers. 6118003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org STATIC_ASSERT(LAST_TYPE == LAST_JS_OBJECT_TYPE); 6119003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org return instance_type() >= FIRST_JS_OBJECT_TYPE; 6120003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 6121003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 61224a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org bool IsJSObjectMap() { 61234a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org return instance_type() >= FIRST_JS_OBJECT_TYPE; 61244a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org } 61258ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org bool IsJSProxyMap() { 61268ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org InstanceType type = instance_type(); 61278ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org return FIRST_JS_PROXY_TYPE <= type && type <= LAST_JS_PROXY_TYPE; 61288ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org } 6129f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org bool IsJSGlobalProxyMap() { 6130f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return instance_type() == JS_GLOBAL_PROXY_TYPE; 6131f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org } 6132f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org bool IsJSGlobalObjectMap() { 6133f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return instance_type() == JS_GLOBAL_OBJECT_TYPE; 6134f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org } 6135f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org bool IsGlobalObjectMap() { 6136f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org const InstanceType type = instance_type(); 6137f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return type == JS_GLOBAL_OBJECT_TYPE || type == JS_BUILTINS_OBJECT_TYPE; 6138f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org } 61394a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 6140c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org inline bool CanOmitMapChecks(); 61412e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 6142e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org static void AddDependentCompilationInfo(Handle<Map> map, 6143e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org DependentCode::DependencyGroup group, 6144e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org CompilationInfo* info); 614541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 6146e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org static void AddDependentCode(Handle<Map> map, 6147e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org DependentCode::DependencyGroup group, 6148e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Handle<Code> code); 6149e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org static void AddDependentIC(Handle<Map> map, 6150e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Handle<Code> stub); 6151003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 6152906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org bool IsMapInArrayPrototypeChain(); 6153906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 615443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 6155a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(Map) 6156c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(Map) 6157c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 6158c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 615931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org void DictionaryMapVerify(); 6160594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void VerifyOmittedMapChecks(); 616143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 616243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6163ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org inline int visitor_id(); 6164ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org inline void set_visitor_id(int visitor_id); 61656a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 61664a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org typedef void (*TraverseCallback)(Map* map, void* data); 61674a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 61684a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org void TraverseTransitionTree(TraverseCallback callback, void* data); 61694a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 61707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // When you set the prototype of an object using the __proto__ accessor you 61717028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // need a new map for the object (the prototype is stored in the map). In 61727028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // order not to multiply maps unnecessarily we store these as transitions in 61737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // the original map. That way we can transition to the same map if the same 61747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // prototype is set, rather than creating a new map every time. The 61757028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // transitions are in the form of a map where the keys are prototype objects 6176f6a0c41471dd401bc4a67b309cfff6f8711b4edfulan@chromium.org // and the values are the maps the are transitioned to. 61773847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com static const int kMaxCachedPrototypeTransitions = 256; 6178c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Handle<Map> TransitionToPrototype(Handle<Map> map, 6179c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Object> prototype); 61803847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 6181911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static const int kMaxPreAllocatedPropertyFields = 255; 6182911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 618343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 61847c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org static const int kInstanceSizesOffset = HeapObject::kHeaderSize; 61857c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; 61863c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize; 61873c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kPrototypeOffset = kBitField3Offset + kPointerSize; 618843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kConstructorOffset = kPrototypeOffset + kPointerSize; 6189de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // Storage for the transition array is overloaded to directly contain a back 6190de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // pointer if unused. When the map has transitions, the back pointer is 6191de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // transferred to the transition array and accessed through an extra 6192de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // indirection. 6193de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org static const int kTransitionsOrBackPointerOffset = 619443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kConstructorOffset + kPointerSize; 619589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org static const int kDescriptorsOffset = 6196de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org kTransitionsOrBackPointerOffset + kPointerSize; 6197a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static const int kCodeCacheOffset = kDescriptorsOffset + kPointerSize; 61982e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org static const int kDependentCodeOffset = kCodeCacheOffset + kPointerSize; 61993c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kSize = kDependentCodeOffset + kPointerSize; 620030ce411529579186181838984710b0b0980857aaricow@chromium.org 620130ce411529579186181838984710b0b0980857aaricow@chromium.org // Layout of pointer fields. Heap iteration code relies on them 6202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // being continuously allocated. 620330ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; 62043c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kPointerFieldsEndOffset = kSize; 620543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62067c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // Byte offsets within kInstanceSizesOffset. 62077c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; 6208a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org static const int kInObjectPropertiesByte = 1; 6209a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org static const int kInObjectPropertiesOffset = 6210a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org kInstanceSizesOffset + kInObjectPropertiesByte; 6211a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org static const int kPreAllocatedPropertyFieldsByte = 2; 6212a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org static const int kPreAllocatedPropertyFieldsOffset = 6213a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org kInstanceSizesOffset + kPreAllocatedPropertyFieldsByte; 62145b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org static const int kVisitorIdByte = 3; 62155b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org static const int kVisitorIdOffset = kInstanceSizesOffset + kVisitorIdByte; 62167c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 621743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Byte offsets within kInstanceAttributesOffset attributes. 62181845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org#if V8_TARGET_LITTLE_ENDIAN 62191845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // Order instance type and bit field together such that they can be loaded 62201845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // together as a 16-bit word with instance type in the lower 8 bits regardless 62214b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org // of endianess. Also provide endian-independent offset to that 16-bit word. 62227c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0; 62231845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kBitFieldOffset = kInstanceAttributesOffset + 1; 62241845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org#else 62251845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kBitFieldOffset = kInstanceAttributesOffset + 0; 62261845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kInstanceTypeOffset = kInstanceAttributesOffset + 1; 62271845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org#endif 62284b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org static const int kInstanceTypeAndBitFieldOffset = 62294b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org kInstanceAttributesOffset + 0; 62301845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kBitField2Offset = kInstanceAttributesOffset + 2; 62311845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kUnusedPropertyFieldsOffset = kInstanceAttributesOffset + 3; 623243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62334b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org STATIC_ASSERT(kInstanceTypeAndBitFieldOffset == 62344b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org Internals::kMapInstanceTypeAndBitFieldOffset); 623518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 623643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Bit positions for bit field. 62373c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kHasNonInstancePrototype = 0; 62383c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kIsHiddenPrototype = 1; 62393c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kHasNamedInterceptor = 2; 62403c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kHasIndexedInterceptor = 3; 62413c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kIsUndetectable = 4; 62423c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kIsObserved = 5; 62433c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int kIsAccessCheckNeeded = 6; 62443c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org class FunctionWithPrototype: public BitField<bool, 7, 1> {}; 62453a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org 6246e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Bit positions for bit field 2 62475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static const int kIsExtensible = 0; 6248830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org static const int kStringWrapperSafeForDefaultValueOf = 1; 6249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org class IsPrototypeMapBits : public BitField<bool, 2, 1> {}; 6250d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org class ElementsKindBits: public BitField<ElementsKind, 3, 5> {}; 6251d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 6252d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com // Derived values from bit field 2 6253d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com static const int8_t kMaximumBitField2FastElementValue = static_cast<int8_t>( 6254d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org (FAST_ELEMENTS + 1) << Map::ElementsKindBits::kShift) - 1; 6255830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org static const int8_t kMaximumBitField2FastSmiElementValue = 6256830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org static_cast<int8_t>((FAST_SMI_ELEMENTS + 1) << 6257d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Map::ElementsKindBits::kShift) - 1; 6258830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org static const int8_t kMaximumBitField2FastHoleyElementValue = 6259830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org static_cast<int8_t>((FAST_HOLEY_ELEMENTS + 1) << 6260d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Map::ElementsKindBits::kShift) - 1; 6261830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org static const int8_t kMaximumBitField2FastHoleySmiElementValue = 6262830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) << 6263d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Map::ElementsKindBits::kShift) - 1; 626440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 6265ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 6266ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kPointerFieldsEndOffset, 6267ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kSize> BodyDescriptor; 6268ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 6269c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Compares this map to another to see if they describe equivalent objects. 6270c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // If |mode| is set to CLEAR_INOBJECT_PROPERTIES, |other| is treated as if 6271c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // it had exactly zero inobject properties. 6272c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // The "shared" flags of both this map and |other| are ignored. 6273c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org bool EquivalentToForNormalization(Map* other, PropertyNormalizationMode mode); 6274c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 627543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 6276e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org static void ConnectElementsTransition(Handle<Map> parent, Handle<Map> child); 6277e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org static void ConnectTransition(Handle<Map> parent, Handle<Map> child, 6278e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org Handle<Name> name, SimpleTransitionFlag flag); 6279975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 6280c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org bool EquivalentToForTransition(Map* other); 6281c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Handle<Map> RawCopy(Handle<Map> map, int instance_size); 6282c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Handle<Map> ShareDescriptor(Handle<Map> map, 6283c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<DescriptorArray> descriptors, 6284c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Descriptor* descriptor); 6285c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Handle<Map> CopyInstallDescriptors( 6286c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Map> map, 6287c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int new_descriptor, 6288c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<DescriptorArray> descriptors); 62899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<Map> CopyAddDescriptor(Handle<Map> map, 62909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Descriptor* descriptor, 62919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TransitionFlag flag); 62929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<Map> CopyReplaceDescriptors( 62939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Map> map, 62949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<DescriptorArray> descriptors, 62959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TransitionFlag flag, 62969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org MaybeHandle<Name> maybe_name, 62979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org SimpleTransitionFlag simple_flag = FULL_TRANSITION); 62983c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static Handle<Map> CopyReplaceDescriptor(Handle<Map> map, 62993c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<DescriptorArray> descriptors, 63003c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Descriptor* descriptor, 63013c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org int index, 63023c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org TransitionFlag flag); 6303c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 6304c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org static Handle<Map> CopyNormalized(Handle<Map> map, 630531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org PropertyNormalizationMode mode); 6306c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6307c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org // Fires when the layout of an object with a leaf map changes. 6308c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org // This includes adding transitions to the leaf map or changing 6309c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org // the descriptor array. 6310c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org inline void NotifyLeafMapLayoutChange(); 6311c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 6312af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org static Handle<Map> TransitionElementsToSlow(Handle<Map> object, 6313af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org ElementsKind to_kind); 6314af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org 6315c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Zaps the contents of backing data structures. Note that the 6316c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // heap verifier (i.e. VerifyMarkingVisitor) relies on zapping of objects 6317c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // holding weak references when incremental marking is used, because it also 6318c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // iterates over objects that are otherwise unreachable. 6319c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // In general we only want to call these functions in release mode when 6320c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // heap verification is turned on. 6321c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org void ZapPrototypeTransitions(); 6322c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org void ZapTransitions(); 6323c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 6324c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org void DeprecateTransitionTree(); 6325c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org void DeprecateTarget(Name* key, DescriptorArray* new_descriptors); 6326c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 6327c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Map* FindLastMatchMap(int verbatim, int length, DescriptorArray* descriptors); 6328c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 6329dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org void UpdateFieldType(int descriptor_number, Handle<Name> name, 6330dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Handle<HeapType> new_type); 6331e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org 6332c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org void PrintGeneralization(FILE* file, 6333c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org const char* reason, 6334c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int modify_index, 6335c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int split, 6336c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int descriptors, 6337c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org bool constant_to_field, 6338c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Representation old_representation, 6339e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org Representation new_representation, 6340e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org HeapType* old_field_type, 6341e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org HeapType* new_field_type); 6342c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 6343c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static inline void SetPrototypeTransitions( 6344c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Map> map, 6345c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<FixedArray> prototype_transitions); 6346c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 6347c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Handle<Map> GetPrototypeTransition(Handle<Map> map, 6348c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Object> prototype); 6349c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Handle<Map> PutPrototypeTransition(Handle<Map> map, 6350c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Object> prototype, 6351c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Map> target_map); 6352c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 6353474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org static const int kFastPropertiesSoftLimit = 12; 6354474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org static const int kMaxFastProperties = 128; 6355474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 635643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(Map); 635743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 635843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 635943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 636043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// An abstract superclass, a marker class really, for simple structure classes. 63617304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// It doesn't carry much functionality but allows struct classes to be 636243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// identified in the type system. 636343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Struct: public HeapObject { 636443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 636543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void InitializeBody(int object_size); 6366975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Struct) 636743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 636843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 636943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63701fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org// A simple one-element struct, useful where smis need to be boxed. 63711fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgclass Box : public Struct { 63721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org public: 63731fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // [value]: the boxed contents. 63741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DECL_ACCESSORS(value, Object) 63751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 6376975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Box) 63771fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 63781fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // Dispatched behavior. 63791fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DECLARE_PRINTER(Box) 63801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DECLARE_VERIFIER(Box) 63811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 63821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org static const int kValueOffset = HeapObject::kHeaderSize; 63831fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org static const int kSize = kValueOffset + kPointerSize; 63841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 63851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org private: 63861fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Box); 63871fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}; 63881fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 63891fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 639031e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager// Script describes a script which has been added to the VM. 639143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Script: public Struct { 639243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 6393e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Script types. 6394e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org enum Type { 63952abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org TYPE_NATIVE = 0, 63962abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org TYPE_EXTENSION = 1, 63972abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org TYPE_NORMAL = 2 6398e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org }; 6399e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 6400e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Script compilation types. 6401e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org enum CompilationType { 64022abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org COMPILATION_TYPE_HOST = 0, 6403e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org COMPILATION_TYPE_EVAL = 1 6404e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org }; 6405e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 64062c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org // Script compilation state. 64072c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org enum CompilationState { 64082c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org COMPILATION_STATE_INITIAL = 0, 64092c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org COMPILATION_STATE_COMPILED = 1 64102c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org }; 64112c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 641243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [source]: the script source. 641343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(source, Object) 641443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 641543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [name]: the script name. 641643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(name, Object) 641743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 64187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // [id]: the script id. 64191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DECL_ACCESSORS(id, Smi) 64207be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 642143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [line_offset]: script line offset in resource from where it was extracted. 642243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(line_offset, Smi) 642343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 642443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [column_offset]: script column offset in resource from where it was 642543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // extracted. 642643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(column_offset, Smi) 642743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 64289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // [context_data]: context data for the context this script was compiled in. 64299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org DECL_ACCESSORS(context_data, Object) 64309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 643143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [wrapper]: the wrapper cache. 6432ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org DECL_ACCESSORS(wrapper, Foreign) 643343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 643443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [type]: the script type. 643543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(type, Smi) 643643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6437c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // [line_ends]: FixedArray of line ends positions. 6438499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org DECL_ACCESSORS(line_ends, Object) 6439245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 64409818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org // [eval_from_shared]: for eval scripts the shared funcion info for the 64419818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org // function from which eval was called. 64429818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org DECL_ACCESSORS(eval_from_shared, Object) 6443e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 6444e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // [eval_from_instructions_offset]: the instruction offset in the code for the 6445e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // function from which eval was called where eval was called. 6446e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org DECL_ACCESSORS(eval_from_instructions_offset, Smi) 6447e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 6448d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // [flags]: Holds an exciting bitfield. 6449d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org DECL_ACCESSORS(flags, Smi) 6450d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 6451d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // [source_url]: sourceURL from magic comment 6452d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org DECL_ACCESSORS(source_url, Object) 6453d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 6454d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // [source_url]: sourceMappingURL magic comment 6455d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org DECL_ACCESSORS(source_mapping_url, Object) 6456d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 6457d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // [compilation_type]: how the the script was compiled. Encoded in the 6458d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // 'flags' field. 6459d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org inline CompilationType compilation_type(); 6460d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org inline void set_compilation_type(CompilationType type); 6461d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 6462d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // [compilation_state]: determines whether the script has already been 6463d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // compiled. Encoded in the 'flags' field. 6464d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org inline CompilationState compilation_state(); 6465d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org inline void set_compilation_state(CompilationState state); 6466d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 6467d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // [is_shared_cross_origin]: An opaque boolean set by the embedder via 6468d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // ScriptOrigin, and used by the embedder to make decisions about the 6469d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // script's level of privilege. V8 just passes this through. Encoded in 6470d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // the 'flags' field. 6471d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org DECL_BOOLEAN_ACCESSORS(is_shared_cross_origin) 6472d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 6473975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Script) 647443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6475152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org // If script source is an external string, check that the underlying 6476152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org // resource is accessible. Otherwise, always return true. 6477152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org inline bool HasValidSource(); 6478152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org 64799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Convert code position into column number. 64809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static int GetColumnNumber(Handle<Script> script, int code_pos); 64819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 64829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Convert code position into (zero-based) line number. 64839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // The non-handlified version does not allocate, but may be much slower. 64849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static int GetLineNumber(Handle<Script> script, int code_pos); 64859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org int GetLineNumber(int code_pos); 64869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 64879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<Object> GetNameOrSourceURL(Handle<Script> script); 64889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 64899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Init line_ends array with code positions of line ends inside script source. 64909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static void InitLineEnds(Handle<Script> script); 64919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 64929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Get the JS object wrapping the given script; create it if none exists. 64939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<JSObject> GetWrapper(Handle<Script> script); 64947c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org void ClearWrapperCache(); 64959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6496a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 6497a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(Script) 6498c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(Script) 649943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6500236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kSourceOffset = HeapObject::kHeaderSize; 650143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kNameOffset = kSourceOffset + kPointerSize; 650243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kLineOffsetOffset = kNameOffset + kPointerSize; 650343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kColumnOffsetOffset = kLineOffsetOffset + kPointerSize; 6504ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org static const int kContextOffset = kColumnOffsetOffset + kPointerSize; 65059085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org static const int kWrapperOffset = kContextOffset + kPointerSize; 650643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kTypeOffset = kWrapperOffset + kPointerSize; 6507d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org static const int kLineEndsOffset = kTypeOffset + kPointerSize; 6508499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org static const int kIdOffset = kLineEndsOffset + kPointerSize; 65099818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org static const int kEvalFromSharedOffset = kIdOffset + kPointerSize; 6510e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org static const int kEvalFrominstructionsOffsetOffset = 65119818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org kEvalFromSharedOffset + kPointerSize; 6512d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org static const int kFlagsOffset = 6513d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org kEvalFrominstructionsOffsetOffset + kPointerSize; 6514d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org static const int kSourceUrlOffset = kFlagsOffset + kPointerSize; 6515d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org static const int kSourceMappingUrlOffset = kSourceUrlOffset + kPointerSize; 6516d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org static const int kSize = kSourceMappingUrlOffset + kPointerSize; 651743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 651843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 65199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org int GetLineNumberWithArray(int code_pos); 65209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6521d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // Bit positions in the flags field. 6522d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org static const int kCompilationTypeBit = 0; 6523d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org static const int kCompilationStateBit = 1; 6524d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org static const int kIsSharedCrossOriginBit = 2; 6525d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 652643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(Script); 652743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 652843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 652943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// List of builtin functions we want to identify to improve code 65315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// generation. 65325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// 65335f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Each entry has a name of a global object property holding an object 65345f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// optionally followed by ".prototype", a name of a builtin function 65355f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// on the object (the one the id is set for), and a label. 65365f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// 65375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Installation of ids for the selected builtin functions is handled 65385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// by the bootstrapper. 65394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org#define FUNCTIONS_WITH_ID_LIST(V) \ 65404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Array.prototype, indexOf, ArrayIndexOf) \ 65414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Array.prototype, lastIndexOf, ArrayLastIndexOf) \ 65424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Array.prototype, push, ArrayPush) \ 65434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Array.prototype, pop, ArrayPop) \ 65444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Array.prototype, shift, ArrayShift) \ 65454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Function.prototype, apply, FunctionApply) \ 65464c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(String.prototype, charCodeAt, StringCharCodeAt) \ 65474c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(String.prototype, charAt, StringCharAt) \ 65484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(String, fromCharCode, StringFromCharCode) \ 65494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, floor, MathFloor) \ 65504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, round, MathRound) \ 65514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, ceil, MathCeil) \ 65524c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, abs, MathAbs) \ 65534c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, log, MathLog) \ 65544c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, exp, MathExp) \ 65554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, sqrt, MathSqrt) \ 65564c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, pow, MathPow) \ 65574c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, max, MathMax) \ 65584c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, min, MathMin) \ 65594c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org V(Math, imul, MathImul) \ 6560dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org V(Math, clz32, MathClz32) \ 6561dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org V(Math, fround, MathFround) 65625f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 65635f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgenum BuiltinFunctionId { 65641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kArrayCode, 65655f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#define DECLARE_FUNCTION_ID(ignored1, ignore2, name) \ 65665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org k##name, 65675f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID) 65685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#undef DECLARE_FUNCTION_ID 65695f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // Fake id for a special case of Math.pow. Note, it continues the 65705f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // list of math functions. 65714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org kMathPowHalf 6572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}; 6573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 6574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 657543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SharedFunctionInfo describes the JSFunction information that can be 657643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// shared by multiple instances of the function. 657743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass SharedFunctionInfo: public HeapObject { 657843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 657943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [name]: Function name. 658043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(name, Object) 658143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 658243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [code]: Function code. 658343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(code, Code) 65849768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org inline void ReplaceCode(Code* code); 658543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 658646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // [optimized_code_map]: Map from native context to optimized code 65874e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // and a shared literals array or Smi(0) if none. 65885a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org DECL_ACCESSORS(optimized_code_map, Object) 65895a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 65904954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Returns index i of the entry with the specified context and OSR entry. 65914954674151afa960af66efb4831df06bde727333yangguo@chromium.org // At position i - 1 is the context, position i the code, and i + 1 the 65924954674151afa960af66efb4831df06bde727333yangguo@chromium.org // literals array. Returns -1 when no matching entry is found. 65934954674151afa960af66efb4831df06bde727333yangguo@chromium.org int SearchOptimizedCodeMap(Context* native_context, BailoutId osr_ast_id); 65945a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 6595d9e468a431d0d87cf3e9898459410eedb1ea9e9aulan@chromium.org // Installs optimized code from the code map on the given closure. The 6596d9e468a431d0d87cf3e9898459410eedb1ea9e9aulan@chromium.org // index has to be consistent with a search result as defined above. 65974954674151afa960af66efb4831df06bde727333yangguo@chromium.org FixedArray* GetLiteralsFromOptimizedCodeMap(int index); 65984954674151afa960af66efb4831df06bde727333yangguo@chromium.org 65994954674151afa960af66efb4831df06bde727333yangguo@chromium.org Code* GetCodeFromOptimizedCodeMap(int index); 6600d9e468a431d0d87cf3e9898459410eedb1ea9e9aulan@chromium.org 66015a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // Clear optimized code map. 66024e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org void ClearOptimizedCodeMap(); 6603906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 6604906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Removed a specific optimized code object from the optimized code map. 6605906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org void EvictFromOptimizedCodeMap(Code* optimized_code, const char* reason); 66065a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 6607a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org void ClearTypeFeedbackInfo(); 6608a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 66094e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // Trims the optimized code map after entries have been removed. 66104e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org void TrimOptimizedCodeMap(int shrink_by); 66114e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 66125a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // Add a new entry to the optimized code map. 66135a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org static void AddToOptimizedCodeMap(Handle<SharedFunctionInfo> shared, 661446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<Context> native_context, 66155a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Handle<Code> code, 66164954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<FixedArray> literals, 66174954674151afa960af66efb4831df06bde727333yangguo@chromium.org BailoutId osr_ast_id); 66184e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 66194e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // Layout description of the optimized code map. 66204e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org static const int kNextMapIndex = 0; 66214e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org static const int kEntriesStart = 1; 66224954674151afa960af66efb4831df06bde727333yangguo@chromium.org static const int kContextOffset = 0; 66234954674151afa960af66efb4831df06bde727333yangguo@chromium.org static const int kCachedCodeOffset = 1; 66244954674151afa960af66efb4831df06bde727333yangguo@chromium.org static const int kLiteralsOffset = 2; 66254954674151afa960af66efb4831df06bde727333yangguo@chromium.org static const int kOsrAstIdOffset = 3; 66264954674151afa960af66efb4831df06bde727333yangguo@chromium.org static const int kEntryLength = 4; 66274e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org static const int kInitialLength = kEntriesStart + kEntryLength; 66285a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 66296a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org // [scope_info]: Scope info. 6630c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org DECL_ACCESSORS(scope_info, ScopeInfo) 66316a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 66325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // [construct stub]: Code stub for constructing instances of this function. 66335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org DECL_ACCESSORS(construct_stub, Code) 66345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 663543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns if this function has been compiled to native code yet. 663643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_compiled(); 663743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 663843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [length]: The function length - usually the number of declared parameters. 663943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Use up to 2^30 parameters. 66404b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int length() const; 664143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_length(int value); 664243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 664343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [formal parameter count]: The declared number of parameters. 66444b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int formal_parameter_count() const; 664543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_formal_parameter_count(int value); 664643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6647b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Set the formal parameter count so the function code will be 6648b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // called without using argument adaptor frames. 6649b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org inline void DontAdaptArguments(); 6650b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 665143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [expected_nof_properties]: Expected number of properties for the function. 66524b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int expected_nof_properties() const; 665343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_expected_nof_properties(int value); 665443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6655a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // [feedback_vector] - accumulates ast node feedback from full-codegen and 6656a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // (increasingly) from crankshafted code where sufficient feedback isn't 6657a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // available. 6658a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org DECL_ACCESSORS(feedback_vector, TypeFeedbackVector) 6659a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 666043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [instance class name]: class name for instances. 666143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(instance_class_name, Object) 666243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6663f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org // [function data]: This field holds some additional data for function. 6664f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org // Currently it either has FunctionTemplateInfo to make benefit the API 66655f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // or Smi identifying a builtin function. 666643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // In the long run we don't want all functions to have this field but 666743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // we can fix that when we have a better model for storing hidden data 666843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // on objects. 666943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(function_data, Object) 667043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6671f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org inline bool IsApiFunction(); 6672f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org inline FunctionTemplateInfo* get_api_func_data(); 66735f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org inline bool HasBuiltinFunctionId(); 66745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org inline BuiltinFunctionId builtin_function_id(); 6675f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 667643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [script info]: Script from which the function originates. 667743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(script, Object) 667843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // [num_literals]: Number of literals used by this function. 66804b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int num_literals() const; 66815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org inline void set_num_literals(int value); 66825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 668343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [start_position_and_type]: Field used to store both the source code 668443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // position, whether or not the function is a function expression, 668543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // and whether or not the function is a toplevel function. The two 668643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // least significants bit indicates whether the function is an 668743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // expression and the rest contains the source code position. 66884b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int start_position_and_type() const; 668943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_start_position_and_type(int value); 669043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 669143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [debug info]: Debug information. 669243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(debug_info, Object) 669343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6694d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // [inferred name]: Name inferred from variable or property 6695d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // assignment of this function. Used to facilitate debugging and 6696d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // profiling of JavaScript code written in OO style, where almost 6697d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // all functions are anonymous but are assigned to object 6698d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // properties. 6699d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org DECL_ACCESSORS(inferred_name, String) 6700d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 6701b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // The function's name if it is non-empty, otherwise the inferred name. 6702b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org String* DebugName(); 6703b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 670443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Position of the 'function' token in the script source. 67054b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int function_token_position() const; 670643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_function_token_position(int function_token_position); 670743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 670843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Position of this function in the script source. 6709f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org inline int start_position() const; 671043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_start_position(int start_position); 671143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 671243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // End position of this function in the script source. 67134b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int end_position() const; 671443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_end_position(int end_position); 671543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 671643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Is this function a function expression in the source code. 67177c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECL_BOOLEAN_ACCESSORS(is_expression) 671843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6719a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // Is this function a top-level function (scripts, evals). 67207c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECL_BOOLEAN_ACCESSORS(is_toplevel) 672143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6722911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Bit field containing various information collected by the compiler to 6723911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // drive optimization. 67244b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int compiler_hints() const; 6725911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void set_compiler_hints(int value); 6726911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 67274b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int ast_node_count() const; 67281456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org inline void set_ast_node_count(int count); 67291456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 67304b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int profiler_ticks() const; 67315aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org inline void set_profiler_ticks(int ticks); 6732212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org 67331456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org // Inline cache age is used to infer whether the function survived a context 67341456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org // disposal or not. In the former case we reset the opt_count. 67351456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org inline int ic_age(); 67361456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org inline void set_ic_age(int age); 6737a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 67382356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Indicates if this function can be lazy compiled. 67392356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // This is used to determine if we can safely flush code from a function 67402356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // when doing GC if we expect that the function will no longer be used. 67417b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation) 67422356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 67435a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // Indicates if this function can be lazy compiled without a context. 67445a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // This is used to determine if we can force compilation without reaching 67455a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // the function through program execution but through other means (e.g. heap 67465a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // iteration by the debugger). 67475a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation_without_context) 67485a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 6749a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Indicates whether optimizations have been disabled for this 6750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // shared function info. If a function is repeatedly optimized or if 6751a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // we cannot optimize the function we disable optimization to avoid 6752a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // spending time attempting to optimize it again. 67537b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org DECL_BOOLEAN_ACCESSORS(optimization_disabled) 6754a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 6755486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // Indicates the language mode. 6756486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org inline StrictMode strict_mode(); 6757486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org inline void set_strict_mode(StrictMode strict_mode); 67587b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 67597b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // False if the function definitely does not allocate an arguments object. 67607b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org DECL_BOOLEAN_ACCESSORS(uses_arguments) 67617b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 67627b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // True if the function has any duplicated parameter names. 67637b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org DECL_BOOLEAN_ACCESSORS(has_duplicate_parameters) 676483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 6765d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Indicates whether the function is a native function. 676634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // These needs special treatment in .call and .apply since 67676fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org // null passed as the receiver should not be translated to the 67686fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org // global object. 67697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECL_BOOLEAN_ACCESSORS(native) 67707c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 67710cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org // Indicate that this builtin needs to be inlined in crankshaft. 67720cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org DECL_BOOLEAN_ACCESSORS(inline_builtin) 67730cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 67747c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Indicates that the function was created by the Function function. 67757c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Though it's anonymous, toString should treat it as if it had the name 67767c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // "anonymous". We don't set the name itself so that the system does not 67777c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // see a binding for it. 67787c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECL_BOOLEAN_ACCESSORS(name_should_print_as_anonymous) 67796fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org 67807b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // Indicates whether the function is a bound function created using 67817b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // the bind function. 67827c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECL_BOOLEAN_ACCESSORS(bound) 67837c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 67847c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Indicates that the function is anonymous (the name field can be set 67857c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // through the API, which does not change this flag). 67867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECL_BOOLEAN_ACCESSORS(is_anonymous) 67877b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 678856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org // Is this a function or top-level/eval code. 678956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org DECL_BOOLEAN_ACCESSORS(is_function) 679056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 679181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // Indicates that code for this function cannot be cached. 679281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org DECL_BOOLEAN_ACCESSORS(dont_cache) 679381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 6794906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Indicates that code for this function cannot be flushed. 6795906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org DECL_BOOLEAN_ACCESSORS(dont_flush) 6796906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 6797f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // Indicates that this function is a generator. 6798f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DECL_BOOLEAN_ACCESSORS(is_generator) 6799f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 68009d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // Indicates that this function is an arrow function. 68019d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DECL_BOOLEAN_ACCESSORS(is_arrow) 68029d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 68032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Indicates that this function is a concise method. 68042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org DECL_BOOLEAN_ACCESSORS(is_concise_method) 68052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 6806a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Indicates that this function is an asm function. 6807a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org DECL_BOOLEAN_ACCESSORS(asm_function) 6808a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 68092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline FunctionKind kind(); 68102c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline void set_kind(FunctionKind kind); 68112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 6812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Indicates whether or not the code in the shared function support 6813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // deoptimization. 6814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline bool has_deoptimization_support(); 6815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 6816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Enable deoptimization support through recompiled code. 6817a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void EnableDeoptimizationSupport(Code* recompiled); 6818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 6819ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org // Disable (further) attempted optimization of all functions sharing this 682056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org // shared function info. 6821594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void DisableOptimization(BailoutReason reason); 6822ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org 68232c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org inline BailoutReason DisableOptimizationReason(); 68242c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 6825e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org // Lookup the bailout ID and DCHECK that it exists in the non-optimized 6826a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // code, returns whether it asserted (i.e., always true if assertions are 6827a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // disabled). 6828471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org bool VerifyBailoutId(BailoutId id); 68290b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 683043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [source code]: Source code for the function. 6831f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org bool HasSourceCode() const; 683278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Handle<Object> GetSourceCode(); 683343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // Number of times the function was optimized. 6835a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline int opt_count(); 6836a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline void set_opt_count(int opt_count); 6837a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 68387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // Number of times the function was deoptimized. 68397028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline void set_deopt_count(int value); 68407028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline int deopt_count(); 68417028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline void increment_deopt_count(); 68427028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 68437028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // Number of time we tried to re-enable optimization after it 68447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // was disabled due to high number of deoptimizations. 68457028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline void set_opt_reenable_tries(int value); 68467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline int opt_reenable_tries(); 68477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 68487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline void TryReenableOptimization(); 68497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 68507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // Stores deopt_count, opt_reenable_tries and ic_age as bit-fields. 68517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline void set_counters(int value); 68524b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int counters() const; 68537028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 68542c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org // Stores opt_count and bailout_reason as bit-fields. 68552c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org inline void set_opt_count_and_bailout_reason(int value); 68564b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int opt_count_and_bailout_reason() const; 68572c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 68582c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org void set_bailout_reason(BailoutReason reason) { 68592c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org set_opt_count_and_bailout_reason( 68602c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org DisabledOptimizationReasonBits::update(opt_count_and_bailout_reason(), 68612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org reason)); 68622c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org } 68632c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 68640cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org // Check whether or not this function is inlineable. 68650cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org bool IsInlineable(); 68660cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 6867a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Source size of this function. 6868a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int SourceSize(); 6869a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 6870911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Calculate the instance size. 6871911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int CalculateInstanceSize(); 6872911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 6873911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Calculate the number of in-object properties. 6874911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int CalculateInObjectProperties(); 6875911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 687643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 6877a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(SharedFunctionInfo) 6878c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(SharedFunctionInfo) 687943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68801456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org void ResetForNewContext(int new_ic_age); 68811456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 6882975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(SharedFunctionInfo) 688343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6884b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Constants. 6885b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org static const int kDontAdaptArgumentsSentinel = -1; 6886b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 688743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 6888ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Pointer fields. 6889236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kNameOffset = HeapObject::kHeaderSize; 689043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kCodeOffset = kNameOffset + kPointerSize; 68915a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org static const int kOptimizedCodeMapOffset = kCodeOffset + kPointerSize; 68925a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org static const int kScopeInfoOffset = kOptimizedCodeMapOffset + kPointerSize; 68936a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org static const int kConstructStubOffset = kScopeInfoOffset + kPointerSize; 6894ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kInstanceClassNameOffset = 6895ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org kConstructStubOffset + kPointerSize; 6896f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org static const int kFunctionDataOffset = 6897ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org kInstanceClassNameOffset + kPointerSize; 6898f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org static const int kScriptOffset = kFunctionDataOffset + kPointerSize; 6899ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kDebugInfoOffset = kScriptOffset + kPointerSize; 6900ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize; 6901a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org static const int kFeedbackVectorOffset = 69028545d496a480910c08fd03335583971e4c6ea805machenbach@chromium.org kInferredNameOffset + kPointerSize; 690330ce411529579186181838984710b0b0980857aaricow@chromium.org#if V8_HOST_ARCH_32_BIT 690430ce411529579186181838984710b0b0980857aaricow@chromium.org // Smi fields. 6905ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kLengthOffset = 6906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org kFeedbackVectorOffset + kPointerSize; 690730ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize; 690843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kExpectedNofPropertiesOffset = 690930ce411529579186181838984710b0b0980857aaricow@chromium.org kFormalParameterCountOffset + kPointerSize; 691030ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kNumLiteralsOffset = 691130ce411529579186181838984710b0b0980857aaricow@chromium.org kExpectedNofPropertiesOffset + kPointerSize; 691271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static const int kStartPositionAndTypeOffset = 691330ce411529579186181838984710b0b0980857aaricow@chromium.org kNumLiteralsOffset + kPointerSize; 691430ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kEndPositionOffset = 691530ce411529579186181838984710b0b0980857aaricow@chromium.org kStartPositionAndTypeOffset + kPointerSize; 691630ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kFunctionTokenPositionOffset = 691730ce411529579186181838984710b0b0980857aaricow@chromium.org kEndPositionOffset + kPointerSize; 691830ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kCompilerHintsOffset = 691930ce411529579186181838984710b0b0980857aaricow@chromium.org kFunctionTokenPositionOffset + kPointerSize; 69202c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org static const int kOptCountAndBailoutReasonOffset = 69212c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org kCompilerHintsOffset + kPointerSize; 69222c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org static const int kCountersOffset = 69232c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org kOptCountAndBailoutReasonOffset + kPointerSize; 69245aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org static const int kAstNodeCountOffset = 69255aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org kCountersOffset + kPointerSize; 69265aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org static const int kProfilerTicksOffset = 69275aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org kAstNodeCountOffset + kPointerSize; 69281044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 692930ce411529579186181838984710b0b0980857aaricow@chromium.org // Total size. 69305aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org static const int kSize = kProfilerTicksOffset + kPointerSize; 693130ce411529579186181838984710b0b0980857aaricow@chromium.org#else 693230ce411529579186181838984710b0b0980857aaricow@chromium.org // The only reason to use smi fields instead of int fields 69334a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // is to allow iteration without maps decoding during 693430ce411529579186181838984710b0b0980857aaricow@chromium.org // garbage collections. 693530ce411529579186181838984710b0b0980857aaricow@chromium.org // To avoid wasting space on 64-bit architectures we use 693630ce411529579186181838984710b0b0980857aaricow@chromium.org // the following trick: we group integer fields into pairs 693730ce411529579186181838984710b0b0980857aaricow@chromium.org // First integer in each pair is shifted left by 1. 693830ce411529579186181838984710b0b0980857aaricow@chromium.org // By doing this we guarantee that LSB of each kPointerSize aligned 693930ce411529579186181838984710b0b0980857aaricow@chromium.org // word is not set and thus this word cannot be treated as pointer 694030ce411529579186181838984710b0b0980857aaricow@chromium.org // to HeapObject during old space traversal. 694130ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kLengthOffset = 6942011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org kFeedbackVectorOffset + kPointerSize; 694330ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kFormalParameterCountOffset = 694430ce411529579186181838984710b0b0980857aaricow@chromium.org kLengthOffset + kIntSize; 694530ce411529579186181838984710b0b0980857aaricow@chromium.org 694630ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kExpectedNofPropertiesOffset = 694730ce411529579186181838984710b0b0980857aaricow@chromium.org kFormalParameterCountOffset + kIntSize; 694830ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kNumLiteralsOffset = 694930ce411529579186181838984710b0b0980857aaricow@chromium.org kExpectedNofPropertiesOffset + kIntSize; 695030ce411529579186181838984710b0b0980857aaricow@chromium.org 695130ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kEndPositionOffset = 69525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org kNumLiteralsOffset + kIntSize; 695330ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kStartPositionAndTypeOffset = 695430ce411529579186181838984710b0b0980857aaricow@chromium.org kEndPositionOffset + kIntSize; 695530ce411529579186181838984710b0b0980857aaricow@chromium.org 695630ce411529579186181838984710b0b0980857aaricow@chromium.org static const int kFunctionTokenPositionOffset = 695730ce411529579186181838984710b0b0980857aaricow@chromium.org kStartPositionAndTypeOffset + kIntSize; 6958ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kCompilerHintsOffset = 695971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org kFunctionTokenPositionOffset + kIntSize; 696030ce411529579186181838984710b0b0980857aaricow@chromium.org 69612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org static const int kOptCountAndBailoutReasonOffset = 69622c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org kCompilerHintsOffset + kIntSize; 69632c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org static const int kCountersOffset = 69642c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org kOptCountAndBailoutReasonOffset + kIntSize; 6965b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 69665aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org static const int kAstNodeCountOffset = 69675aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org kCountersOffset + kIntSize; 69685aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org static const int kProfilerTicksOffset = 69695aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org kAstNodeCountOffset + kIntSize; 69705aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org 6971ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Total size. 69725aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org static const int kSize = kProfilerTicksOffset + kIntSize; 697330ce411529579186181838984710b0b0980857aaricow@chromium.org 697430ce411529579186181838984710b0b0980857aaricow@chromium.org#endif 69754a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 69765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize); 697743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6978ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef FixedBodyDescriptor<kNameOffset, 6979011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org kFeedbackVectorOffset + kPointerSize, 6980ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kSize> BodyDescriptor; 6981ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 698243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Bit positions in start_position_and_type. 698343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The source code start position is in the 30 most significant bits of 698443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // the start_position_and_type field. 69856e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org static const int kIsExpressionBit = 0; 69866e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org static const int kIsTopLevelBit = 1; 698743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kStartPositionShift = 2; 69886e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1); 698931e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager 6990911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Bit positions in compiler_hints. 69917b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org enum CompilerHints { 69927b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org kAllowLazyCompilation, 69935a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org kAllowLazyCompilationWithoutContext, 69941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kOptimizationDisabled, 69957b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org kStrictModeFunction, 69967b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org kUsesArguments, 69977b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org kHasDuplicateParameters, 69987c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org kNative, 69990cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org kInlineBuiltin, 70007c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org kBoundFunction, 70017c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org kIsAnonymous, 70027c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org kNameShouldPrintAsAnonymous, 700356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org kIsFunction, 700481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kDontCache, 7005906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org kDontFlush, 70069d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org kIsArrow, 70072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kIsGenerator, 70082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org kIsConciseMethod, 7009a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org kIsAsmFunction, 70107c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org kCompilerHintsCount // Pseudo entry 70117b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org }; 7012911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 70132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class FunctionKindBits : public BitField<FunctionKind, kIsArrow, 3> {}; 70142c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 70152c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class DeoptCountBits : public BitField<int, 0, 4> {}; 70162c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class OptReenableTriesBits : public BitField<int, 4, 18> {}; 70172c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class ICAgeBits : public BitField<int, 22, 8> {}; 70187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 70192c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class OptCountBits : public BitField<int, 0, 22> {}; 70202c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class DisabledOptimizationReasonBits : public BitField<int, 22, 8> {}; 70212c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 702249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org private: 702349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org#if V8_HOST_ARCH_32_BIT 702449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org // On 32 bit platforms, compiler hints is a smi. 702549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org static const int kCompilerHintsSmiTagSize = kSmiTagSize; 702649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org static const int kCompilerHintsSize = kPointerSize; 702749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org#else 702849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org // On 64 bit platforms, compiler hints is not a smi, see comment above. 702949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org static const int kCompilerHintsSmiTagSize = 0; 703049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org static const int kCompilerHintsSize = kIntSize; 703149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org#endif 703249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 70337c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org STATIC_ASSERT(SharedFunctionInfo::kCompilerHintsCount <= 70347c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte); 70357c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 703649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org public: 70376fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org // Constants for optimizing codegen for strict mode function and 7038d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // native tests. 7039394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Allows to use byte-width instructions. 704049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org static const int kStrictModeBitWithinByte = 704149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org (kStrictModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte; 704249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 7043d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org static const int kNativeBitWithinByte = 7044d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org (kNative + kCompilerHintsSmiTagSize) % kBitsPerByte; 70456fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org 7046731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#if defined(V8_TARGET_LITTLE_ENDIAN) 704749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org static const int kStrictModeByteOffset = kCompilerHintsOffset + 70486fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org (kStrictModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte; 7049d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org static const int kNativeByteOffset = kCompilerHintsOffset + 7050d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org (kNative + kCompilerHintsSmiTagSize) / kBitsPerByte; 7051731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#elif defined(V8_TARGET_BIG_ENDIAN) 705249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org static const int kStrictModeByteOffset = kCompilerHintsOffset + 70536fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org (kCompilerHintsSize - 1) - 70546fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org ((kStrictModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte); 7055d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org static const int kNativeByteOffset = kCompilerHintsOffset + 70566fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org (kCompilerHintsSize - 1) - 7057d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org ((kNative + kCompilerHintsSmiTagSize) / kBitsPerByte); 705849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org#else 705949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org#error Unknown byte ordering 706049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org#endif 706149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 706249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org private: 706331e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo); 706443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 706543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 706643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7067f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org// Printing support. 7068f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgstruct SourceCodeOf { 706931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org explicit SourceCodeOf(SharedFunctionInfo* v, int max = -1) 7070f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org : value(v), max_length(max) {} 7071f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org const SharedFunctionInfo* value; 7072f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org int max_length; 7073f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org}; 7074f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 7075f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 7076f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const SourceCodeOf& v); 7077f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 7078f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org 7079e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass JSGeneratorObject: public JSObject { 7080e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public: 7081e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // [function]: The function corresponding to this generator object. 7082e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECL_ACCESSORS(function, JSFunction) 7083e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 708477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org // [context]: The context of the suspended computation. 708577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org DECL_ACCESSORS(context, Context) 7086e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 7087ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // [receiver]: The receiver of the suspended computation. 7088ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org DECL_ACCESSORS(receiver, Object) 7089ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 7090e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // [continuation]: Offset into code of continuation. 709177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org // 709277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org // A positive offset indicates a suspended generator. The special 709377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org // kGeneratorExecuting and kGeneratorClosed values indicate that a generator 709477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org // cannot be resumed. 70954b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int continuation() const; 7096e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org inline void set_continuation(int continuation); 7097fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org inline bool is_closed(); 7098fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org inline bool is_executing(); 7099af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org inline bool is_suspended(); 7100e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 710157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // [operand_stack]: Saved operand stack. 7102e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECL_ACCESSORS(operand_stack, FixedArray) 7103e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 710457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // [stack_handler_index]: Index of first stack handler in operand_stack, or -1 710557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // if the captured activation had no stack handler. 71064b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int stack_handler_index() const; 710757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org inline void set_stack_handler_index(int stack_handler_index); 710857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 7109975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSGeneratorObject) 7110e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 7111e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Dispatched behavior. 7112e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECLARE_PRINTER(JSGeneratorObject) 7113e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECLARE_VERIFIER(JSGeneratorObject) 7114e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 711577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org // Magic sentinel values for the continuation. 711677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org static const int kGeneratorExecuting = -1; 711777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org static const int kGeneratorClosed = 0; 711877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org 7119e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Layout description. 7120e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static const int kFunctionOffset = JSObject::kHeaderSize; 7121e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static const int kContextOffset = kFunctionOffset + kPointerSize; 7122ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org static const int kReceiverOffset = kContextOffset + kPointerSize; 7123ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org static const int kContinuationOffset = kReceiverOffset + kPointerSize; 7124e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static const int kOperandStackOffset = kContinuationOffset + kPointerSize; 712557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kStackHandlerIndexOffset = 712657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org kOperandStackOffset + kPointerSize; 712757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kSize = kStackHandlerIndexOffset + kPointerSize; 7128e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 7129ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // Resume mode, for use by runtime functions. 71308a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org enum ResumeMode { NEXT, THROW }; 7131ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 713257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // Yielding from a generator returns an object with the following inobject 71334ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // properties. See Context::iterator_result_map() for the map. 713457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kResultValuePropertyIndex = 0; 713557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kResultDonePropertyIndex = 1; 713657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kResultPropertyCount = 2; 713757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 713857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kResultValuePropertyOffset = JSObject::kHeaderSize; 713957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kResultDonePropertyOffset = 714057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org kResultValuePropertyOffset + kPointerSize; 714157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org static const int kResultSize = kResultDonePropertyOffset + kPointerSize; 714257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 7143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org private: 7144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSGeneratorObject); 7145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}; 7146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 7147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 7148ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Representation for module instance objects. 7149ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comclass JSModule: public JSObject { 7150ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com public: 7151ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // [context]: the context holding the module's locals, or undefined if none. 7152ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com DECL_ACCESSORS(context, Object) 7153ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 715481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // [scope_info]: Scope info. 715581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org DECL_ACCESSORS(scope_info, ScopeInfo) 715681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 7157975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSModule) 7158ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 7159ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Dispatched behavior. 7160a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSModule) 7161c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSModule) 7162ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 7163ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Layout description. 7164ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com static const int kContextOffset = JSObject::kHeaderSize; 716581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kScopeInfoOffset = kContextOffset + kPointerSize; 716681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org static const int kSize = kScopeInfoOffset + kPointerSize; 7167ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 7168ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com private: 7169ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com DISALLOW_IMPLICIT_CONSTRUCTORS(JSModule); 7170ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}; 7171ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 7172ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 717343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// JSFunction describes JavaScript functions. 717443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass JSFunction: public JSObject { 717543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 717643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [prototype_or_initial_map]: 717743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(prototype_or_initial_map, Object) 717843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 717934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // [shared]: The information about the function that 718043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // can be shared by instances. 718143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(shared, SharedFunctionInfo) 718243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 718343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [context]: The context for this function. 718443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Context* context(); 718543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_context(Object* context); 718658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org inline JSObject* global_proxy(); 718743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 718843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [code]: The generated code object for this function. Executed 718943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // when the function is invoked, e.g. foo() or new foo(). See 719043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [[Call]] and [[Construct]] description in ECMA-262, section 719143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 8.6.2, page 27. 719243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Code* code(); 7193a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline void set_code(Code* code); 71946e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org inline void set_code_no_write_barrier(Code* code); 7195a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline void ReplaceCode(Code* code); 719643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 71970b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // Tells whether this function is builtin. 71980b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org inline bool IsBuiltin(); 71990b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 7200d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Tells whether this function is defined in a native script. 7201d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline bool IsFromNativeScript(); 7202d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 7203d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Tells whether this function is defined in an extension script. 7204d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org inline bool IsFromExtensionScript(); 7205d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 7206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Tells whether or not the function needs arguments adaption. 7207a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline bool NeedsArgumentsAdaption(); 7208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7209a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Tells whether or not this function has been optimized. 7210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org inline bool IsOptimized(); 7211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7212a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org // Tells whether or not this function can be optimized. 7213a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org inline bool IsOptimizable(); 7214a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 7215a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Mark this function for lazy recompilation. The function will be 7216a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // recompiled the next time it is executed. 72174954674151afa960af66efb4831df06bde727333yangguo@chromium.org void MarkForOptimization(); 72184954674151afa960af66efb4831df06bde727333yangguo@chromium.org void MarkForConcurrentOptimization(); 72194954674151afa960af66efb4831df06bde727333yangguo@chromium.org void MarkInOptimizationQueue(); 72204954674151afa960af66efb4831df06bde727333yangguo@chromium.org 7221a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Tells whether or not the function is already marked for lazy 7222a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // recompilation. 72234954674151afa960af66efb4831df06bde727333yangguo@chromium.org inline bool IsMarkedForOptimization(); 72244954674151afa960af66efb4831df06bde727333yangguo@chromium.org inline bool IsMarkedForConcurrentOptimization(); 7225304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 72269259716434187c932704601f700375e53d865de8rossberg@chromium.org // Tells whether or not the function is on the concurrent recompilation queue. 72274954674151afa960af66efb4831df06bde727333yangguo@chromium.org inline bool IsInOptimizationQueue(); 7228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7229011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Inobject slack tracking is the way to reclaim unused inobject space. 7230011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // 7231011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // The instance size is initially determined by adding some slack to 7232011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // expected_nof_properties (to allow for a few extra properties added 7233011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // after the constructor). There is no guarantee that the extra space 7234011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // will not be wasted. 7235011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // 7236011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Here is the algorithm to reclaim the unused inobject space: 7237011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // - Detect the first constructor call for this JSFunction. 7238011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // When it happens enter the "in progress" state: initialize construction 7239011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // counter in the initial_map and set the |done_inobject_slack_tracking| 7240011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // flag. 7241011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // - While the tracking is in progress create objects filled with 7242011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // one_pointer_filler_map instead of undefined_value. This way they can be 7243011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // resized quickly and safely. 7244011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // - Once enough (kGenerousAllocationCount) objects have been created 7245011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // compute the 'slack' (traverse the map transition tree starting from the 7246011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // initial_map and find the lowest value of unused_property_fields). 7247011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // - Traverse the transition tree again and decrease the instance size 7248011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // of every map. Existing objects will resize automatically (they are 7249011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // filled with one_pointer_filler_map). All further allocations will 7250011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // use the adjusted instance size. 7251011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // - SharedFunctionInfo's expected_nof_properties left unmodified since 7252011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // allocations made using different closures could actually create different 7253011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // kind of objects (see prototype inheritance pattern). 7254011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // 7255011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Important: inobject slack tracking is not attempted during the snapshot 7256011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // creation. 7257011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 7258011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org static const int kGenerousAllocationCount = Map::ConstructionCount::kMax; 7259011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org static const int kFinishSlackTracking = 1; 7260011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org static const int kNoSlackTracking = 0; 7261011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 7262011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // True if the initial_map is set and the object constructions countdown 7263011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // counter is not zero. 7264011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org inline bool IsInobjectSlackTrackingInProgress(); 7265011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 7266011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Starts the tracking. 7267011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Initializes object constructions countdown counter in the initial map. 7268011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // IsInobjectSlackTrackingInProgress is normally true after this call, 7269011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // except when tracking have not been started (e.g. the map has no unused 7270011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // properties or the snapshot is being built). 7271011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org void StartInobjectSlackTracking(); 7272011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 7273011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Completes the tracking. 7274011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // IsInobjectSlackTrackingInProgress is false after this call. 7275011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org void CompleteInobjectSlackTracking(); 7276011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 7277394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // [literals_or_bindings]: Fixed array holding either 7278394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // the materialized literals or the bindings of a bound function. 72799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // 72809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // If the function contains object, regexp or array literals, the 72819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // literals array prefix contains the object, regexp, and array 72829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // function to be used when creating these literals. This is 72839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // necessary so that we do not dynamically lookup the object, regexp 72849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // or array functions. Performing a dynamic lookup, we might end up 72859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // using the functions from a new context that we should not have 72869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // access to. 7287394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // 7288394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // On bound functions, the array is a (copy-on-write) fixed-array containing 7289394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // the function that was bound, bound this-value and any bound 7290394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // arguments. Bound functions never contain literals. 7291394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com DECL_ACCESSORS(literals_or_bindings, FixedArray) 7292394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 7293394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com inline FixedArray* literals(); 7294394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com inline void set_literals(FixedArray* literals); 7295394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 7296394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com inline FixedArray* function_bindings(); 7297394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com inline void set_function_bindings(FixedArray* bindings); 729843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 729943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The initial map for an object created by this constructor. 730043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Map* initial_map(); 730131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org static void SetInitialMap(Handle<JSFunction> function, Handle<Map> map, 730231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org Handle<Object> prototype); 730343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool has_initial_map(); 7304057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static void EnsureHasInitialMap(Handle<JSFunction> function); 730543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 730643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get and set the prototype property on a JSFunction. If the 730743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // function has an initial map the prototype is set on the initial 730843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // map. Otherwise, the prototype is put in the initial map field 730943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // until an initial map is needed. 731043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool has_prototype(); 731143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool has_instance_prototype(); 731243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Object* prototype(); 731343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Object* instance_prototype(); 7314ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static void SetPrototype(Handle<JSFunction> function, 7315ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Handle<Object> value); 7316ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static void SetInstancePrototype(Handle<JSFunction> function, 7317ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Handle<Object> value); 731843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7319a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // Creates a new closure for the fucntion with the same bindings, 7320a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // bound values, and prototype. An equivalent of spec operations 7321a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // ``CloneMethod`` and ``CloneBoundFunction``. 7322a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static Handle<JSFunction> CloneClosure(Handle<JSFunction> function); 7323a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 73244111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // After prototype is removed, it will not be created when accessed, and 73254111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // [[Construct]] from this function will not be allowed. 7326a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org bool RemovePrototype(); 73274111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org inline bool should_have_prototype(); 73284111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 732943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Accessor for this function's initial map's [[class]] 733043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // property. This is primarily used by ECMA native functions. This 733143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // method sets the class_name field of this function's initial map 733243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // to a given value. It creates an initial map if this function does 733343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // not have one. Note that this method does not copy the initial map 733443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // if it has one already, but simply replaces it with the new value. 733543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Instances created afterwards will have a map whose [[class]] is 733643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // set to 'value', but there is no guarantees on instances created 733743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // before. 7338de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org void SetInstanceClassName(String* name); 733943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 734043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns if this function has been compiled to native code yet. 734143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool is_compiled(); 734243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73433d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // [next_function_link]: Links functions into various lists, e.g. the list 73443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // of optimized functions hanging off the native_context. The CodeFlusher 73453d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // uses this link to chain together flushing candidates. Treated weakly 73463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // by the garbage collector. 7347a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DECL_ACCESSORS(next_function_link, Object) 7348a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7349a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Prints the name of the function using PrintF. 7350dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org void PrintName(FILE* out = stdout); 7351a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7352975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSFunction) 735343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7354145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com // Iterates the objects, including code objects indirectly referenced 7355145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com // through pointers to the first instruction in the code object. 7356145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com void JSFunctionIterateBody(int object_size, ObjectVisitor* v); 7357145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com 735843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 7359a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSFunction) 7360c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSFunction) 736143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 736243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the number of allocated literals. 73639fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org inline int NumberOfLiterals(); 736443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 736546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Retrieve the native context from a function's literal array. 736646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static Context* NativeContextFromLiterals(FixedArray* literals); 7367236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 73681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // Used for flags such as --hydrogen-filter. 73691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool PassesFilter(const char* raw_filter); 7370906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 7371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Layout descriptors. The last property (from kNonWeakFieldsEndOffset to 7372a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // kSize) is weak and has special handling during garbage collection. 7373145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com static const int kCodeEntryOffset = JSObject::kHeaderSize; 737426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org static const int kPrototypeOrInitialMapOffset = 7375145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com kCodeEntryOffset + kPointerSize; 737643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSharedFunctionInfoOffset = 737743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kPrototypeOrInitialMapOffset + kPointerSize; 737843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kContextOffset = kSharedFunctionInfoOffset + kPointerSize; 737943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kLiteralsOffset = kContextOffset + kPointerSize; 7380a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const int kNonWeakFieldsEndOffset = kLiteralsOffset + kPointerSize; 7381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const int kNextFunctionLinkOffset = kNonWeakFieldsEndOffset; 7382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static const int kSize = kNextFunctionLinkOffset + kPointerSize; 738343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Layout of the literals array. 7385236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kLiteralsPrefixSize = 1; 738646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static const int kLiteralNativeContextIndex = 0; 7387e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 7388394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Layout of the bound-function binding array. 7389394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static const int kBoundFunctionIndex = 0; 7390394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static const int kBoundThisIndex = 1; 7391394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static const int kBoundArgumentsStartIndex = 2; 7392394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 739343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 739443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunction); 739543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 739643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 739743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73985a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// JSGlobalProxy's prototype must be a JSGlobalObject or null, 73995a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// and the prototype is hidden. JSGlobalProxy always delegates 74005a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// property accesses to its prototype if the prototype is not null. 74015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// 74025a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// A JSGlobalProxy can be reinitialized which will preserve its identity. 74035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// 74045a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Accessing a JSGlobalProxy requires security check. 74055a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 74065a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgclass JSGlobalProxy : public JSObject { 74075a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org public: 740846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // [native_context]: the owner native context of this global proxy object. 74095a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // It is null value if this object is not used by any context. 741046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org DECL_ACCESSORS(native_context, Object) 74115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 741229699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org // [hash]: The hash code property (undefined if not initialized yet). 741329699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org DECL_ACCESSORS(hash, Object) 741429699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org 7415975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSGlobalProxy) 74165a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 741708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inline bool IsDetachedFrom(GlobalObject* global) const; 7418113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org 74195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Dispatched behavior. 7420a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSGlobalProxy) 7421c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSGlobalProxy) 74225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 74235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Layout description. 742446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static const int kNativeContextOffset = JSObject::kHeaderSize; 742529699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org static const int kHashOffset = kNativeContextOffset + kPointerSize; 742629699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org static const int kSize = kHashOffset + kPointerSize; 74275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 74285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org private: 74295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalProxy); 74305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}; 74315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 74325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 743343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Forward declaration. 743443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass JSBuiltinsObject; 743543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 743643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Common super class for JavaScript global objects and the special 743743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// builtins global objects. 743843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass GlobalObject: public JSObject { 743943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 744043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [builtins]: the object holding the runtime routines written in JS. 744143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(builtins, JSBuiltinsObject) 744243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 744346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // [native context]: the natives corresponding to this global object. 744446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org DECL_ACCESSORS(native_context, Context) 744543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7446355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org // [global context]: the most recent (i.e. innermost) global context. 7447355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org DECL_ACCESSORS(global_context, Context) 7448355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 744958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org // [global proxy]: the global proxy object of the context 745058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org DECL_ACCESSORS(global_proxy, JSObject) 74515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 7452975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(GlobalObject) 74535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 745443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 745543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kBuiltinsOffset = JSObject::kHeaderSize; 745646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static const int kNativeContextOffset = kBuiltinsOffset + kPointerSize; 7457355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org static const int kGlobalContextOffset = kNativeContextOffset + kPointerSize; 745858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org static const int kGlobalProxyOffset = kGlobalContextOffset + kPointerSize; 745958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org static const int kHeaderSize = kGlobalProxyOffset + kPointerSize; 746043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 746143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 746231e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager DISALLOW_IMPLICIT_CONSTRUCTORS(GlobalObject); 746343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 746443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 746543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 746643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// JavaScript global object. 746743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass JSGlobalObject: public GlobalObject { 746843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 7469975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSGlobalObject) 747043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7471057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Ensure that the global object has a cell for the given property name. 7472057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static Handle<PropertyCell> EnsurePropertyCell(Handle<JSGlobalObject> global, 7473057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org Handle<Name> name); 7474057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 7475113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org inline bool IsDetached(); 7476113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org 747743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 7478a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSGlobalObject) 7479c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSGlobalObject) 748043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 748143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 74825a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org static const int kSize = GlobalObject::kHeaderSize; 748343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 748443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 748543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalObject); 748643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 748743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 748843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 748943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Builtins global object which holds the runtime routines written in 749043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// JavaScript. 749143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass JSBuiltinsObject: public GlobalObject { 749243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 749343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Accessors for the runtime routines written in JavaScript. 749443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Object* javascript_builtin(Builtins::JavaScript id); 749543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_javascript_builtin(Builtins::JavaScript id, Object* value); 749643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7497c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org // Accessors for code of the runtime routines written in JavaScript. 7498c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org inline Code* javascript_builtin_code(Builtins::JavaScript id); 7499c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org inline void set_javascript_builtin_code(Builtins::JavaScript id, Code* value); 7500c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 7501975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSBuiltinsObject) 750243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 750343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 7504a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSBuiltinsObject) 7505c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSBuiltinsObject) 750643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 750743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. The size of the builtins object includes 7508c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org // room for two pointers per runtime routine written in javascript 7509c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org // (function and code object). 751043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kJSBuiltinsCount = Builtins::id_count; 751143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kJSBuiltinsOffset = GlobalObject::kHeaderSize; 7512c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static const int kJSBuiltinsCodeOffset = 7513c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org GlobalObject::kHeaderSize + (kJSBuiltinsCount * kPointerSize); 751443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = 7515c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org kJSBuiltinsCodeOffset + (kJSBuiltinsCount * kPointerSize); 7516c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 7517c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static int OffsetOfFunctionWithId(Builtins::JavaScript id) { 7518c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org return kJSBuiltinsOffset + id * kPointerSize; 7519c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org } 7520c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 7521c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org static int OffsetOfCodeWithId(Builtins::JavaScript id) { 7522c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org return kJSBuiltinsCodeOffset + id * kPointerSize; 7523c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org } 7524c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 752543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 752643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(JSBuiltinsObject); 752743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 752843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 752943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75304efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org// Representation for JS Wrapper objects, String, Number, Boolean, etc. 753143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass JSValue: public JSObject { 753243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 753343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [value]: the object being wrapped. 753443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(value, Object) 753543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7536975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSValue) 753743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 753843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 7539a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSValue) 7540c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSValue) 754143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 754243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 754343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kValueOffset = JSObject::kHeaderSize; 754443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kValueOffset + kPointerSize; 754543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 754643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 754743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(JSValue); 754843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 754943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 755031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 75514efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgclass DateCache; 75524efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 75534efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org// Representation for JS date objects. 75544efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgclass JSDate: public JSObject { 75554efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org public: 75564efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // If one component is NaN, all of them are, indicating a NaN time value. 75574efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [value]: the time value. 75584efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(value, Object) 75594efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [year]: caches year. Either undefined, smi, or NaN. 75604efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(year, Object) 75614efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [month]: caches month. Either undefined, smi, or NaN. 75624efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(month, Object) 75634efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [day]: caches day. Either undefined, smi, or NaN. 75644efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(day, Object) 75654efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [weekday]: caches day of week. Either undefined, smi, or NaN. 75664efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(weekday, Object) 75674efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [hour]: caches hours. Either undefined, smi, or NaN. 75684efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(hour, Object) 75694efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [min]: caches minutes. Either undefined, smi, or NaN. 75704efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(min, Object) 75714efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [sec]: caches seconds. Either undefined, smi, or NaN. 75724efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(sec, Object) 75734efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // [cache stamp]: sample of the date cache stamp at the 7574fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // moment when chached fields were cached. 75754efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DECL_ACCESSORS(cache_stamp, Object) 75764efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 7577975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSDate) 75784efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 75794efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // Returns the date field with the specified index. 75804efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // See FieldIndex for the list of date fields. 7581212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org static Object* GetField(Object* date, Smi* index); 75824efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 75834efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org void SetValue(Object* value, bool is_value_nan); 75844efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 75854efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 75864efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // Dispatched behavior. 7587a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSDate) 7588c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSDate) 7589c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 75904efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // The order is important. It must be kept in sync with date macros 75914efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // in macros.py. 75924efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org enum FieldIndex { 75934efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kDateValue, 75944efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kYear, 75954efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kMonth, 75964efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kDay, 75974efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kWeekday, 75984efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kHour, 75994efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kMinute, 76004efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kSecond, 76014efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kFirstUncachedField, 76024efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kMillisecond = kFirstUncachedField, 76034efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kDays, 76044efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kTimeInDay, 76054efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kFirstUTCField, 76064efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kYearUTC = kFirstUTCField, 76074efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kMonthUTC, 76084efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kDayUTC, 76094efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kWeekdayUTC, 76104efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kHourUTC, 76114efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kMinuteUTC, 76124efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kSecondUTC, 76134efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kMillisecondUTC, 76144efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kDaysUTC, 76154efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kTimeInDayUTC, 76164efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org kTimezoneOffset 76174efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org }; 76184efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 76194efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // Layout description. 76204efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kValueOffset = JSObject::kHeaderSize; 76214efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kYearOffset = kValueOffset + kPointerSize; 76224efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kMonthOffset = kYearOffset + kPointerSize; 76234efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kDayOffset = kMonthOffset + kPointerSize; 76244efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kWeekdayOffset = kDayOffset + kPointerSize; 76254efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kHourOffset = kWeekdayOffset + kPointerSize; 76264efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kMinOffset = kHourOffset + kPointerSize; 76274efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kSecOffset = kMinOffset + kPointerSize; 76284efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kCacheStampOffset = kSecOffset + kPointerSize; 76294efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org static const int kSize = kCacheStampOffset + kPointerSize; 76304efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 76314efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org private: 76324efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org inline Object* DoGetField(FieldIndex index); 76334efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 76344efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org Object* GetUTCField(FieldIndex index, double value, DateCache* date_cache); 76354efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 76364efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org // Computes and caches the cacheable fields of the date. 7637fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org inline void SetCachedFields(int64_t local_time_ms, DateCache* date_cache); 76384efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 76394efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 76404efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSDate); 76414efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org}; 76424efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 76434efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 764431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// Representation of message objects used for error reporting through 764531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// the API. The messages are formatted in JavaScript so this object is 764631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// a real JavaScript object. The information used for formatting the 764731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// error messages are not directly accessible from JavaScript to 764831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// prevent leaking information to user code called during error 764931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// formatting. 765031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgclass JSMessageObject: public JSObject { 765131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org public: 765231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // [type]: the type of error message. 765331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org DECL_ACCESSORS(type, String) 765431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 765531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // [arguments]: the arguments for formatting the error message. 765631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org DECL_ACCESSORS(arguments, JSArray) 765731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 765831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // [script]: the script from which the error message originated. 765931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org DECL_ACCESSORS(script, Object) 766031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 766131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // [stack_frames]: an array of stack frames for this error object. 766231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org DECL_ACCESSORS(stack_frames, Object) 766331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 766431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // [start_position]: the start position in the script for the error message. 76654b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int start_position() const; 766631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org inline void set_start_position(int value); 766731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 766831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // [end_position]: the end position in the script for the error message. 76694b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int end_position() const; 767031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org inline void set_end_position(int value); 767131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 7672975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSMessageObject) 767331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 767431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // Dispatched behavior. 7675a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSMessageObject) 7676c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSMessageObject) 767731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 767831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // Layout description. 767931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org static const int kTypeOffset = JSObject::kHeaderSize; 768031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org static const int kArgumentsOffset = kTypeOffset + kPointerSize; 768131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org static const int kScriptOffset = kArgumentsOffset + kPointerSize; 7682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static const int kStackFramesOffset = kScriptOffset + kPointerSize; 768331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org static const int kStartPositionOffset = kStackFramesOffset + kPointerSize; 768431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org static const int kEndPositionOffset = kStartPositionOffset + kPointerSize; 768531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org static const int kSize = kEndPositionOffset + kPointerSize; 768631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 768731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org typedef FixedBodyDescriptor<HeapObject::kMapOffset, 768831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org kStackFramesOffset + kPointerSize, 768931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org kSize> BodyDescriptor; 769031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org}; 769131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 769231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 7693236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org// Regular expressions 76947be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// The regular expression holds a single reference to a FixedArray in 76957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// the kDataOffset field. 76967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// The FixedArray contains the following data: 76977be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// - tag : type of regexp implementation (not compiled yet, atom or irregexp) 76987be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// - reference to the original source string 76997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// - reference to the original flag string 77007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// If it is an atom regexp 77017be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// - a reference to a literal string to search for 77027be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// If it is an irregexp regexp: 77032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// - a reference to code for Latin1 inputs (bytecode or compiled), or a smi 7704ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org// used for tracking the last usage (used for code flushing). 7705ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org// - a reference to code for UC16 inputs (bytecode or compiled), or a smi 7706ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org// used for tracking the last usage (used for code flushing).. 77077be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// - max number of registers used by irregexp implementations. 77087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// - number of capture registers (output values) of the regexp. 7709236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgclass JSRegExp: public JSObject { 7710236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org public: 7711a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Meaning of Type: 7712a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // NOT_COMPILED: Initial value. No data has been stored in the JSRegExp yet. 7713a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // ATOM: A simple string to match against using an indexOf operation. 7714a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // IRREGEXP: Compiled with Irregexp. 7715a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // IRREGEXP_NATIVE: Compiled to native code with Irregexp. 7716381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org enum Type { NOT_COMPILED, ATOM, IRREGEXP }; 7717a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org enum Flag { 7718a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org NONE = 0, 7719a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org GLOBAL = 1, 7720a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org IGNORE_CASE = 2, 7721a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org MULTILINE = 4, 7722a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org STICKY = 8 7723a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org }; 7724236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 77259fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org class Flags { 77269fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org public: 77279fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org explicit Flags(uint32_t value) : value_(value) { } 77289fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org bool is_global() { return (value_ & GLOBAL) != 0; } 77299fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org bool is_ignore_case() { return (value_ & IGNORE_CASE) != 0; } 77309fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org bool is_multiline() { return (value_ & MULTILINE) != 0; } 7731a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org bool is_sticky() { return (value_ & STICKY) != 0; } 77329fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org uint32_t value() { return value_; } 77339fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org private: 77349fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org uint32_t value_; 77359fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org }; 7736236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 7737236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org DECL_ACCESSORS(data, Object) 7738236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 77399fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org inline Type TypeTag(); 7740bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org inline int CaptureCount(); 7741a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org inline Flags GetFlags(); 7742a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org inline String* Pattern(); 77439fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org inline Object* DataAt(int index); 77447be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Set implementation data after the object has been prepared. 77457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org inline void SetDataAt(int index, Object* value); 7746ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 77472c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static int code_index(bool is_latin1) { 77482c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (is_latin1) { 77492c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return kIrregexpLatin1CodeIndex; 775068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } else { 775168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org return kIrregexpUC16CodeIndex; 775268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 775368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 77549fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org 77552c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static int saved_code_index(bool is_latin1) { 77562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (is_latin1) { 77572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return kIrregexpLatin1CodeSavedIndex; 7758ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } else { 7759ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org return kIrregexpUC16CodeSavedIndex; 7760ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 7761ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 7762ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 7763975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSRegExp) 7764236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 7765236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org // Dispatched behavior. 7766c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSRegExp) 7767236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 77689fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org static const int kDataOffset = JSObject::kHeaderSize; 776971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static const int kSize = kDataOffset + kPointerSize; 77709fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org 77717be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Indices in the data array. 77729fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org static const int kTagIndex = 0; 77739fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org static const int kSourceIndex = kTagIndex + 1; 77749fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org static const int kFlagsIndex = kSourceIndex + 1; 77757be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org static const int kDataIndex = kFlagsIndex + 1; 77767be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // The data fields are used in different ways depending on the 77777be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // value of the tag. 77787be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Atom regexps (literal strings). 77797be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org static const int kAtomPatternIndex = kDataIndex; 77807be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 77817be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org static const int kAtomDataSize = kAtomPatternIndex + 1; 77827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 77832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Irregexp compiled code or bytecode for Latin1. If compilation 7784a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // fails, this fields hold an exception object that should be 7785a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // thrown if the regexp is used again. 77862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static const int kIrregexpLatin1CodeIndex = kDataIndex; 7787a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // Irregexp compiled code or bytecode for UC16. If compilation 7788a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // fails, this fields hold an exception object that should be 7789a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // thrown if the regexp is used again. 77907be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org static const int kIrregexpUC16CodeIndex = kDataIndex + 1; 7791ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 77922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Saved instance of Irregexp compiled code or bytecode for Latin1 that 7793ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // is a potential candidate for flushing. 77942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static const int kIrregexpLatin1CodeSavedIndex = kDataIndex + 2; 7795ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Saved instance of Irregexp compiled code or bytecode for UC16 that is 7796ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // a potential candidate for flushing. 7797ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kIrregexpUC16CodeSavedIndex = kDataIndex + 3; 7798ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 77992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Maximal number of registers used by either Latin1 or UC16. 78007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Only used to check that there is enough stack space 7801ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kIrregexpMaxRegisterCountIndex = kDataIndex + 4; 78027be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Number of captures in the compiled regexp. 7803ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kIrregexpCaptureCountIndex = kDataIndex + 5; 78047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 78057be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org static const int kIrregexpDataSize = kIrregexpCaptureCountIndex + 1; 78060c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 78070c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Offsets directly into the data fixed array. 78080c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org static const int kDataTagOffset = 78090c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org FixedArray::kHeaderSize + kTagIndex * kPointerSize; 78102c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static const int kDataOneByteCodeOffset = 78112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org FixedArray::kHeaderSize + kIrregexpLatin1CodeIndex * kPointerSize; 7812b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org static const int kDataUC16CodeOffset = 7813b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org FixedArray::kHeaderSize + kIrregexpUC16CodeIndex * kPointerSize; 78140c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org static const int kIrregexpCaptureCountOffset = 78150c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org FixedArray::kHeaderSize + kIrregexpCaptureCountIndex * kPointerSize; 781625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 781725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // In-object fields. 781825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org static const int kSourceFieldIndex = 0; 781925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org static const int kGlobalFieldIndex = 1; 782025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org static const int kIgnoreCaseFieldIndex = 2; 782125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org static const int kMultilineFieldIndex = 3; 782225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org static const int kLastIndexFieldIndex = 4; 7823c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org static const int kInObjectFieldCount = 5; 7824ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 7825ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // The uninitialized value for a regexp code object. 7826ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kUninitializedValue = -1; 7827ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 7828ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // The compilation error value for the regexp code object. The real error 7829ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // object is in the saved code field. 7830ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kCompilationErrorValue = -2; 7831ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 7832ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // When we store the sweep generation at which we moved the code from the 7833ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // code index to the saved code index we mask it of to be in the [0:255] 7834ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // range. 7835ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kCodeAgeMask = 0xff; 78369fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org}; 78379fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org 78389fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org 7839f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass CompilationCacheShape : public BaseShape<HashTableKey*> { 784086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 784186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static inline bool IsMatch(HashTableKey* key, Object* value) { 784286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->IsMatch(value); 784386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 784486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 784586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static inline uint32_t Hash(HashTableKey* key) { 784686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->Hash(); 784786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 784886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 784986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 785086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org return key->HashForObject(object); 785186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 785286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 7853865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 785486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 785586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kPrefixSize = 0; 785686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kEntrySize = 2; 785786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 785886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 78599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 7860c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass CompilationCacheTable: public HashTable<CompilationCacheTable, 7861c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CompilationCacheShape, 786286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org HashTableKey*> { 78639fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org public: 78649fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org // Find cached value for a string key, otherwise return null. 78659e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> Lookup(Handle<String> src, Handle<Context> context); 7866040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org Handle<Object> LookupEval(Handle<String> src, 7867040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org Handle<SharedFunctionInfo> shared, 7868040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org StrictMode strict_mode, int scope_position); 78699e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> LookupRegExp(Handle<String> source, JSRegExp::Flags flags); 78709e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static Handle<CompilationCacheTable> Put( 78719e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<CompilationCacheTable> cache, Handle<String> src, 78729e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Context> context, Handle<Object> value); 78739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static Handle<CompilationCacheTable> PutEval( 78749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<CompilationCacheTable> cache, Handle<String> src, 7875040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org Handle<SharedFunctionInfo> context, Handle<SharedFunctionInfo> value, 78769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org int scope_position); 78779e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static Handle<CompilationCacheTable> PutRegExp( 78789e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<CompilationCacheTable> cache, Handle<String> src, 78799e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org JSRegExp::Flags flags, Handle<FixedArray> value); 7880a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void Remove(Object* value); 7881a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7882975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(CompilationCacheTable) 78839fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org 78849fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org private: 78859fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable); 7886236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org}; 7887236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 7888236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 7889ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgclass CodeCache: public Struct { 7890ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org public: 7891ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org DECL_ACCESSORS(default_cache, FixedArray) 7892ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org DECL_ACCESSORS(normal_type_cache, Object) 7893ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7894ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Add the code object to the cache. 78959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static void Update( 78969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<CodeCache> cache, Handle<Name> name, Handle<Code> code); 7897ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7898ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Lookup code object in the cache. Returns code object if found and undefined 7899ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // if not. 7900750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Object* Lookup(Name* name, Code::Flags flags); 7901ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7902ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Get the internal index of a code object in the cache. Returns -1 if the 7903ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // code object is not in that cache. This index can be used to later call 7904ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // RemoveByIndex. The cache cannot be modified between a call to GetIndex and 7905ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // RemoveByIndex. 790699a37fa2988524a4a6deafb9f83a58304935af6fsgjesse@chromium.org int GetIndex(Object* name, Code* code); 7907ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7908ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Remove an object from the cache with the provided internal index. 790999a37fa2988524a4a6deafb9f83a58304935af6fsgjesse@chromium.org void RemoveByIndex(Object* name, Code* code, int index); 7910ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7911975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(CodeCache) 7912ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7913a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 7914a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(CodeCache) 7915c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(CodeCache) 7916ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7917ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kDefaultCacheOffset = HeapObject::kHeaderSize; 7918ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kNormalTypeCacheOffset = 7919ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org kDefaultCacheOffset + kPointerSize; 7920ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kSize = kNormalTypeCacheOffset + kPointerSize; 7921ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7922ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org private: 79239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static void UpdateDefaultCache( 79249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code); 79259fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static void UpdateNormalTypeCache( 79269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code); 7927750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Object* LookupDefaultCache(Name* name, Code::Flags flags); 7928750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Object* LookupNormalTypeCache(Name* name, Code::Flags flags); 7929ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7930ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Code cache layout of the default cache. Elements are alternating name and 7931ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // code objects for non normal load/store/call IC's. 7932ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kCodeCacheEntrySize = 2; 7933ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kCodeCacheEntryNameOffset = 0; 7934ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kCodeCacheEntryCodeOffset = 1; 7935ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7936ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCache); 7937ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}; 7938ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7939ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7940f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass CodeCacheHashTableShape : public BaseShape<HashTableKey*> { 7941ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org public: 7942ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static inline bool IsMatch(HashTableKey* key, Object* value) { 7943ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return key->IsMatch(value); 7944ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 7945ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7946ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static inline uint32_t Hash(HashTableKey* key) { 7947ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return key->Hash(); 7948ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 7949ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7950ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 7951ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return key->HashForObject(object); 7952ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 7953ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7954865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 7955ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7956ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kPrefixSize = 0; 7957ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kEntrySize = 2; 7958ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}; 7959ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7960ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7961c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgclass CodeCacheHashTable: public HashTable<CodeCacheHashTable, 7962c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CodeCacheHashTableShape, 7963ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org HashTableKey*> { 7964ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org public: 7965750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Object* Lookup(Name* name, Code::Flags flags); 79669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<CodeCacheHashTable> Put( 79679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<CodeCacheHashTable> table, 79689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name> name, 79699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code); 7970ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7971750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int GetIndex(Name* name, Code::Flags flags); 7972ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org void RemoveByIndex(int index); 7973ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7974975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(CodeCacheHashTable) 7975ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7976ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Initial size of the fixed array backing the hash table. 7977ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org static const int kInitialSize = 64; 7978ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7979ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org private: 7980ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCacheHashTable); 7981ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}; 7982ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7983ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7984e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgclass PolymorphicCodeCache: public Struct { 7985e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org public: 7986e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org DECL_ACCESSORS(cache, Object) 7987e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 7988394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static void Update(Handle<PolymorphicCodeCache> cache, 7989394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com MapHandleList* maps, 7990394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Code::Flags flags, 7991394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<Code> code); 7992394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 7993394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 7994394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Returns an undefined value if the entry is not found. 7995394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<Object> Lookup(MapHandleList* maps, Code::Flags flags); 7996e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 7997975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(PolymorphicCodeCache) 7998e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 7999a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 8000a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(PolymorphicCodeCache) 8001c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(PolymorphicCodeCache) 8002e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8003e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org static const int kCacheOffset = HeapObject::kHeaderSize; 8004e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org static const int kSize = kCacheOffset + kPointerSize; 8005e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8006e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org private: 8007e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCache); 8008e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org}; 8009e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8010e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8011e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgclass PolymorphicCodeCacheHashTable 8012c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org : public HashTable<PolymorphicCodeCacheHashTable, 8013c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CodeCacheHashTableShape, 8014c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org HashTableKey*> { 8015e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org public: 8016394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Object* Lookup(MapHandleList* maps, int code_kind); 8017394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 80188496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org static Handle<PolymorphicCodeCacheHashTable> Put( 80198496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<PolymorphicCodeCacheHashTable> hash_table, 80208496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org MapHandleList* maps, 80218496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org int code_kind, 80228496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<Code> code); 8023e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8024975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(PolymorphicCodeCacheHashTable) 8025e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8026e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org static const int kInitialSize = 64; 8027e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org private: 8028e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCacheHashTable); 8029e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org}; 8030e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8031e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8032f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgclass TypeFeedbackInfo: public Struct { 8033f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org public: 8034f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org inline int ic_total_count(); 8035f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org inline void set_ic_total_count(int count); 8036f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 80371456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org inline int ic_with_type_info_count(); 80383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org inline void change_ic_with_type_info_count(int delta); 80393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 80403e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org inline int ic_generic_count(); 80413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org inline void change_ic_generic_count(int delta); 804246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 804346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline void initialize_storage(); 804446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 804546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline void change_own_type_change_checksum(); 804646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline int own_type_change_checksum(); 804746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 804846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline void set_inlined_type_change_checksum(int checksum); 804946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inline bool matches_inlined_type_change_checksum(int checksum); 8050f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 80518545d496a480910c08fd03335583971e4c6ea805machenbach@chromium.org 8052975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(TypeFeedbackInfo) 8053f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 8054a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 8055a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(TypeFeedbackInfo) 8056c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(TypeFeedbackInfo) 8057f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 805846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static const int kStorage1Offset = HeapObject::kHeaderSize; 805946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static const int kStorage2Offset = kStorage1Offset + kPointerSize; 80603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org static const int kStorage3Offset = kStorage2Offset + kPointerSize; 80613e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org static const int kSize = kStorage3Offset + kPointerSize; 8062f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 8063f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org private: 806446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static const int kTypeChangeChecksumBits = 7; 806546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 806646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org class ICTotalCountField: public BitField<int, 0, 806746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org kSmiValueSize - kTypeChangeChecksumBits> {}; // NOLINT 806846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org class OwnTypeChangeChecksum: public BitField<int, 806946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org kSmiValueSize - kTypeChangeChecksumBits, 807046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org kTypeChangeChecksumBits> {}; // NOLINT 807146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org class ICsWithTypeInfoCountField: public BitField<int, 0, 807246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org kSmiValueSize - kTypeChangeChecksumBits> {}; // NOLINT 807346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org class InlinedTypeChangeChecksum: public BitField<int, 807446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org kSmiValueSize - kTypeChangeChecksumBits, 807546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org kTypeChangeChecksumBits> {}; // NOLINT 807646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 8077f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackInfo); 8078f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org}; 8079f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 8080f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 808146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgenum AllocationSiteMode { 808246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org DONT_TRACK_ALLOCATION_SITE, 808346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org TRACK_ALLOCATION_SITE, 808446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org LAST_ALLOCATION_SITE_MODE = TRACK_ALLOCATION_SITE 808559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org}; 808659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 808759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 8088bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.orgclass AllocationSite: public Struct { 8089bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org public: 8090bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org static const uint32_t kMaximumArrayBytesToPretransition = 8 * 1024; 8091c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org static const double kPretenureRatio; 8092c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org static const int kPretenureMinimumCreated = 100; 8093c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 8094c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // Values for pretenure decision field. 80954ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org enum PretenureDecision { 8096c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org kUndecided = 0, 8097c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org kDontTenure = 1, 8098196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kMaybeTenure = 2, 8099196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kTenure = 3, 8100196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org kZombie = 4, 81014ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org kLastPretenureDecisionValue = kZombie 8102c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org }; 8103bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8104196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org const char* PretenureDecisionName(PretenureDecision decision); 8105196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 8106bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org DECL_ACCESSORS(transition_info, Object) 81073d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // nested_site threads a list of sites that represent nested literals 81083d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // walked in a particular order. So [[1, 2], 1, 2] will have one 81093d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // nested_site, but [[1, 2], 3, [4]] will have a list of two. 81103d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org DECL_ACCESSORS(nested_site, Object) 81114ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org DECL_ACCESSORS(pretenure_data, Smi) 81124ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org DECL_ACCESSORS(pretenure_create_count, Smi) 8113528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org DECL_ACCESSORS(dependent_code, DependentCode) 8114ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DECL_ACCESSORS(weak_next, Object) 8115bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8116528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org inline void Initialize(); 8117bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8118b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org // This method is expensive, it should only be called for reporting. 8119b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org bool IsNestedSite(); 8120b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org 81214ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org // transition_info bitfields, for constructed array transition info. 8122b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org class ElementsKindBits: public BitField<ElementsKind, 0, 15> {}; 8123b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org class UnusedBits: public BitField<int, 15, 14> {}; 8124b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org class DoNotInlineBit: public BitField<bool, 29, 1> {}; 8125b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 81264ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org // Bitfields for pretenure_data 8127196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class MementoFoundCountBits: public BitField<int, 0, 26> {}; 8128196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org class PretenureDecisionBits: public BitField<PretenureDecision, 26, 3> {}; 8129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org class DeoptDependentCodeBit: public BitField<bool, 29, 1> {}; 81304ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org STATIC_ASSERT(PretenureDecisionBits::kMax >= kLastPretenureDecisionValue); 81314ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 813271ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org // Increments the mementos found counter and returns true when the first 813371ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org // memento was found for a given allocation site. 813471ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org inline bool IncrementMementoFoundCount(); 8135c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 8136c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org inline void IncrementMementoCreateCount(); 8137c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 8138034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org PretenureFlag GetPretenureMode(); 8139034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org 8140034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org void ResetPretenureDecision(); 8141c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 81424ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org PretenureDecision pretenure_decision() { 81434ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org int value = pretenure_data()->value(); 81444ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org return PretenureDecisionBits::decode(value); 81454ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } 81464ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 81474ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org void set_pretenure_decision(PretenureDecision decision) { 81484ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org int value = pretenure_data()->value(); 81494ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org set_pretenure_data( 81504ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Smi::FromInt(PretenureDecisionBits::update(value, decision)), 81514ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org SKIP_WRITE_BARRIER); 81524ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } 81534ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 8154f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org bool deopt_dependent_code() { 8155f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int value = pretenure_data()->value(); 8156f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DeoptDependentCodeBit::decode(value); 8157f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 8158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 8159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org void set_deopt_dependent_code(bool deopt) { 8160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int value = pretenure_data()->value(); 8161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org set_pretenure_data( 8162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Smi::FromInt(DeoptDependentCodeBit::update(value, deopt)), 8163f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org SKIP_WRITE_BARRIER); 8164f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 8165f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 81664ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org int memento_found_count() { 81674ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org int value = pretenure_data()->value(); 81684ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org return MementoFoundCountBits::decode(value); 81694ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } 81704ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 81714ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org inline void set_memento_found_count(int count); 81724ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 81734ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org int memento_create_count() { 81744ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org return pretenure_create_count()->value(); 81754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } 81764ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 81774ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org void set_memento_create_count(int count) { 81784ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org set_pretenure_create_count(Smi::FromInt(count), SKIP_WRITE_BARRIER); 81794ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org } 81804ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org 8181c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // The pretenuring decision is made during gc, and the zombie state allows 8182c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // us to recognize when an allocation site is just being kept alive because 8183c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // a later traversal of new space may discover AllocationMementos that point 8184c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // to this AllocationSite. 8185c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org bool IsZombie() { 81864ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org return pretenure_decision() == kZombie; 8187c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 8188c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 8189196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org bool IsMaybeTenure() { 8190196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org return pretenure_decision() == kMaybeTenure; 8191196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org } 8192196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 8193c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org inline void MarkZombie(); 8194c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 8195196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline bool MakePretenureDecision(PretenureDecision current_decision, 8196196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org double ratio, 8197196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org bool maximum_size_scavenge); 8198196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 8199196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org inline bool DigestPretenuringFeedback(bool maximum_size_scavenge); 8200c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 8201bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org ElementsKind GetElementsKind() { 8202e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!SitePointsToLiteral()); 8203b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org int value = Smi::cast(transition_info())->value(); 8204b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org return ElementsKindBits::decode(value); 8205bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 8206bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8207bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org void SetElementsKind(ElementsKind kind) { 8208b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org int value = Smi::cast(transition_info())->value(); 8209b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org set_transition_info(Smi::FromInt(ElementsKindBits::update(value, kind)), 8210b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org SKIP_WRITE_BARRIER); 8211b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org } 8212b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 8213b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org bool CanInlineCall() { 8214b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org int value = Smi::cast(transition_info())->value(); 8215b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org return DoNotInlineBit::decode(value) == 0; 8216b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org } 8217b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 8218b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org void SetDoNotInlineCall() { 8219b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org int value = Smi::cast(transition_info())->value(); 8220b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org set_transition_info(Smi::FromInt(DoNotInlineBit::update(value, true)), 8221b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org SKIP_WRITE_BARRIER); 8222bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 8223bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8224b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org bool SitePointsToLiteral() { 8225bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org // If transition_info is a smi, then it represents an ElementsKind 8226bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org // for a constructed array. Otherwise, it must be a boilerplate 8227b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org // for an object or array literal. 8228b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org return transition_info()->IsJSArray() || transition_info()->IsJSObject(); 8229bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 8230bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 82319b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org static void DigestTransitionFeedback(Handle<AllocationSite> site, 82329b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org ElementsKind to_kind); 8233b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 8234b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org enum Reason { 8235b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org TENURING, 8236b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org TRANSITIONS 8237b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org }; 8238b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 82394ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org static void AddDependentCompilationInfo(Handle<AllocationSite> site, 82404ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org Reason reason, 82414ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org CompilationInfo* info); 8242b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 8243bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org DECLARE_PRINTER(AllocationSite) 8244bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org DECLARE_VERIFIER(AllocationSite) 8245bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8246975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(AllocationSite) 8247bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org static inline AllocationSiteMode GetMode( 8248bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org ElementsKind boilerplate_elements_kind); 8249bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org static inline AllocationSiteMode GetMode(ElementsKind from, ElementsKind to); 8250662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org static inline bool CanTrack(InstanceType type); 8251bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8252ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static const int kTransitionInfoOffset = HeapObject::kHeaderSize; 82533d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org static const int kNestedSiteOffset = kTransitionInfoOffset + kPointerSize; 82544ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org static const int kPretenureDataOffset = kNestedSiteOffset + kPointerSize; 82554ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org static const int kPretenureCreateCountOffset = 82564ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org kPretenureDataOffset + kPointerSize; 825790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org static const int kDependentCodeOffset = 82584ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org kPretenureCreateCountOffset + kPointerSize; 8259528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static const int kWeakNextOffset = kDependentCodeOffset + kPointerSize; 8260ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static const int kSize = kWeakNextOffset + kPointerSize; 8261ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 8262af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org // During mark compact we need to take special care for the dependent code 8263af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org // field. 8264af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org static const int kPointerFieldsBeginOffset = kTransitionInfoOffset; 8265af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org static const int kPointerFieldsEndOffset = kDependentCodeOffset; 8266af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 8267af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org // For other visitors, use the fixed body descriptor below. 8268ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org typedef FixedBodyDescriptor<HeapObject::kHeaderSize, 8269528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org kDependentCodeOffset + kPointerSize, 8270ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org kSize> BodyDescriptor; 8271ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 8272bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org private: 8273b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline DependentCode::DependencyGroup ToDependencyGroup(Reason reason); 8274c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org bool PretenuringDecisionMade() { 82754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org return pretenure_decision() != kUndecided; 8276c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 8277c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 8278bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationSite); 8279bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org}; 8280bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8281bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8282ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass AllocationMemento: public Struct { 828359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org public: 8284bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org static const int kAllocationSiteOffset = HeapObject::kHeaderSize; 8285bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org static const int kSize = kAllocationSiteOffset + kPointerSize; 828659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 8287bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org DECL_ACCESSORS(allocation_site, Object) 8288bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 8289c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org bool IsValid() { 8290c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org return allocation_site()->IsAllocationSite() && 8291c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org !AllocationSite::cast(allocation_site())->IsZombie(); 8292c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 8293bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org AllocationSite* GetAllocationSite() { 8294e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsValid()); 8295bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org return AllocationSite::cast(allocation_site()); 8296bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 829759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 8298ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DECLARE_PRINTER(AllocationMemento) 8299ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DECLARE_VERIFIER(AllocationMemento) 830059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 8301975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(AllocationMemento) 830259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 830359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org private: 8304ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationMemento); 830559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org}; 830659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 830759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 8308486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// Representation of a slow alias as part of a sloppy arguments objects. 8309486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// For fast aliases (if HasSloppyArgumentsElements()): 8310ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// - the parameter map contains an index into the context 8311ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// - all attributes of the element have default values 8312ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// For slow aliases (if HasDictionaryArgumentsElements()): 8313ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// - the parameter map contains no fast alias mapping (i.e. the hole) 8314ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// - this struct (in the slow backing store) contains an index into the context 8315ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// - all attributes are available as part if the property details 8316ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgclass AliasedArgumentsEntry: public Struct { 8317ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org public: 83184b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int aliased_context_slot() const; 8319ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org inline void set_aliased_context_slot(int count); 8320ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 8321975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(AliasedArgumentsEntry) 8322ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 8323a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 8324a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(AliasedArgumentsEntry) 8325c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(AliasedArgumentsEntry) 8326ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 8327ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org static const int kAliasedContextSlot = HeapObject::kHeaderSize; 8328ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org static const int kSize = kAliasedContextSlot + kPointerSize; 8329ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 8330ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org private: 8331ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(AliasedArgumentsEntry); 8332ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org}; 8333ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 8334ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 833543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum AllowNullsFlag {ALLOW_NULLS, DISALLOW_NULLS}; 833643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum RobustnessFlag {ROBUST_STRING_TRAVERSAL, FAST_STRING_TRAVERSAL}; 833743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 833843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 83397c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgclass StringHasher { 83407c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org public: 8341fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org explicit inline StringHasher(int length, uint32_t seed); 83427c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 8343a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org template <typename schar> 8344a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static inline uint32_t HashSequentialString(const schar* chars, 8345a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int length, 8346a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint32_t seed); 83477c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 8348a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Reads all the data, even for long strings and computes the utf16 length. 8349a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static uint32_t ComputeUtf8Hash(Vector<const char> chars, 8350a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint32_t seed, 8351a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int* utf16_length_out); 83527c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 8353d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Calculated hash value for a string consisting of 1 to 8354d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // String::kMaxArrayIndexSize digits with no leading zeros (except "0"). 8355d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // value is represented decimal value. 83565b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org static uint32_t MakeArrayIndexHash(uint32_t value, int length); 8357d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 8358f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // No string is allowed to have a hash of zero. That value is reserved 8359f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // for internal properties. If the hash calculation yields zero then we 8360f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // use 27 instead. 8361f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const int kZeroHash = 27; 8362f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 836333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // Reusable parts of the hashing algorithm. 8364a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint16_t c)); 836533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org INLINE(static uint32_t GetHashCore(uint32_t running_hash)); 836633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8367a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org protected: 8368a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Returns the value to store in the hash field of a string with 8369a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // the given length and contents. 8370a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint32_t GetHashField(); 8371a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Returns true if the hash of this string can be computed without 8372a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // looking at the contents. 8373a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline bool has_trivial_hash(); 8374a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Adds a block of characters to the hash. 8375a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org template<typename Char> 8376a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline void AddCharacters(const Char* chars, int len); 837733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 837833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org private: 8379a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Add a character to the hash. 8380a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline void AddCharacter(uint16_t c); 8381a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Update index. Returns true if string is still an index. 8382a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline bool UpdateIndex(uint16_t c); 8383a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 838433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org int length_; 838533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org uint32_t raw_running_hash_; 838633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org uint32_t array_index_; 838733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org bool is_array_index_; 8388a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool is_first_char_; 8389a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DISALLOW_COPY_AND_ASSIGN(StringHasher); 83907c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}; 83917c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 83927c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 83934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass IteratingStringHasher : public StringHasher { 83944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org public: 83954c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org static inline uint32_t Hash(String* string, uint32_t seed); 83964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org inline void VisitOneByteString(const uint8_t* chars, int length); 83974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org inline void VisitTwoByteString(const uint16_t* chars, int length); 83984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 83994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org private: 84004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org inline IteratingStringHasher(int len, uint32_t seed) 84014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org : StringHasher(len, seed) {} 84024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org DISALLOW_COPY_AND_ASSIGN(IteratingStringHasher); 84034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}; 84044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 84054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 8406870a0b67c822d289024711912e2512af01b66c3bager@chromium.org// The characteristics of a string are stored in its map. Retrieving these 8407870a0b67c822d289024711912e2512af01b66c3bager@chromium.org// few bits of information is moderately expensive, involving two memory 8408870a0b67c822d289024711912e2512af01b66c3bager@chromium.org// loads where the second is dependent on the first. To improve efficiency 8409870a0b67c822d289024711912e2512af01b66c3bager@chromium.org// the shape of the string is given its own class so that it can be retrieved 8410870a0b67c822d289024711912e2512af01b66c3bager@chromium.org// once and used for several string operations. A StringShape is small enough 8411870a0b67c822d289024711912e2512af01b66c3bager@chromium.org// to be passed by value and is immutable, but be aware that flattening a 8412c3e50d815532238589ae8c2f65b6467e4adae811ager@chromium.org// string can potentially alter its shape. Also be aware that a GC caused by 8413c3e50d815532238589ae8c2f65b6467e4adae811ager@chromium.org// something else can alter the shape of a string due to ConsString 8414bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// shortcutting. Keeping these restrictions in mind has proven to be error- 8415bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// prone and so we no longer put StringShapes in variables unless there is a 8416bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// concrete performance benefit at that particular point in the code. 8417870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgclass StringShape BASE_EMBEDDED { 8418870a0b67c822d289024711912e2512af01b66c3bager@chromium.org public: 841908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inline explicit StringShape(const String* s); 8420870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline explicit StringShape(Map* s); 8421870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline explicit StringShape(InstanceType t); 8422870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline bool IsSequential(); 8423870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline bool IsExternal(); 8424870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline bool IsCons(); 84254668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org inline bool IsSliced(); 84264668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org inline bool IsIndirect(); 84272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline bool IsExternalOneByte(); 8428870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline bool IsExternalTwoByte(); 84292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline bool IsSequentialOneByte(); 8430870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline bool IsSequentialTwoByte(); 84314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org inline bool IsInternalized(); 8432870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline StringRepresentationTag representation_tag(); 8433ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org inline uint32_t encoding_tag(); 8434870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline uint32_t full_representation_tag(); 8435870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline uint32_t size_tag(); 8436870a0b67c822d289024711912e2512af01b66c3bager@chromium.org#ifdef DEBUG 8437870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline uint32_t type() { return type_; } 8438870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline void invalidate() { valid_ = false; } 8439870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline bool valid() { return valid_; } 8440870a0b67c822d289024711912e2512af01b66c3bager@chromium.org#else 8441870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline void invalidate() { } 8442870a0b67c822d289024711912e2512af01b66c3bager@chromium.org#endif 8443e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 8444870a0b67c822d289024711912e2512af01b66c3bager@chromium.org private: 8445870a0b67c822d289024711912e2512af01b66c3bager@chromium.org uint32_t type_; 8446870a0b67c822d289024711912e2512af01b66c3bager@chromium.org#ifdef DEBUG 8447870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline void set_valid() { valid_ = true; } 8448870a0b67c822d289024711912e2512af01b66c3bager@chromium.org bool valid_; 8449870a0b67c822d289024711912e2512af01b66c3bager@chromium.org#else 8450870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline void set_valid() { } 8451870a0b67c822d289024711912e2512af01b66c3bager@chromium.org#endif 8452870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}; 8453870a0b67c822d289024711912e2512af01b66c3bager@chromium.org 8454870a0b67c822d289024711912e2512af01b66c3bager@chromium.org 84554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// The Name abstract class captures anything that can be used as a property 84564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// name, i.e., strings and symbols. All names store a hash value. 84574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgclass Name: public HeapObject { 84584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org public: 84594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Get and set the hash field of the name. 84604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org inline uint32_t hash_field(); 84614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org inline void set_hash_field(uint32_t value); 84624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 84634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Tells whether the hash code has been computed. 84644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org inline bool HasHashCode(); 84654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 84664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Returns a hash value used for the property table 84674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org inline uint32_t Hash(); 84684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 8469750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Equality operations. 8470750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline bool Equals(Name* other); 84712ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline static bool Equals(Handle<Name> one, Handle<Name> two); 8472750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 8473750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Conversion. 8474750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline bool AsArrayIndex(uint32_t* index); 8475750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 84765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // Whether name can only name own properties. 84775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org inline bool IsOwn(); 84785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 8479975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Name) 84804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 8481750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org DECLARE_PRINTER(Name) 8482750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 84834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Layout description. 84844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kHashFieldOffset = HeapObject::kHeaderSize; 84854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kSize = kHashFieldOffset + kPointerSize; 84864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 84874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Mask constant for checking if a name has a computed hash code 84884a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // and if it is a string that is an array index. The least significant bit 84894a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // indicates whether a hash code has been computed. If the hash code has 84904a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // been computed the 2nd bit tells whether the string can be used as an 84914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // array index. 84924a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kHashNotComputedMask = 1; 84934a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kIsNotArrayIndexMask = 1 << 1; 84944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kNofHashBitFields = 2; 84954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 84964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Shift constant retrieving hash code from hash field. 84974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kHashShift = kNofHashBitFields; 84984a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 84994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Only these bits are relevant in the hash, since the top two are shifted 85004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // out. 85014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const uint32_t kHashBitMask = 0xffffffffu >> kHashShift; 85024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Array index strings this short can keep their index in the hash field. 85044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kMaxCachedArrayIndexLength = 7; 85054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // For strings which are array indexes the hash value has the string length 85074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // mixed into the hash, mainly to avoid a hash value of zero which would be 85084a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // the case for the string '0'. 24 bits are used for the array index value. 85094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kArrayIndexValueBits = 24; 85104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kArrayIndexLengthBits = 85114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields; 85124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 8513d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT((kArrayIndexLengthBits > 0)); 85144a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 8515d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org class ArrayIndexValueBits : public BitField<unsigned int, kNofHashBitFields, 8516e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org kArrayIndexValueBits> {}; // NOLINT 8517d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org class ArrayIndexLengthBits : public BitField<unsigned int, 8518d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org kNofHashBitFields + kArrayIndexValueBits, 8519e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org kArrayIndexLengthBits> {}; // NOLINT 85204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85214a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we 85224a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // could use a mask to test if the length of string is less than or equal to 85234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // kMaxCachedArrayIndexLength. 8524d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1)); 85254a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 8526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static const unsigned int kContainsCachedArrayIndexMask = 85273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org (~static_cast<unsigned>(kMaxCachedArrayIndexLength) 85283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org << ArrayIndexLengthBits::kShift) | 85294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org kIsNotArrayIndexMask; 85304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Value of empty hash field indicating that the hash is not computed. 85324a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kEmptyHashField = 85334a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org kIsNotArrayIndexMask | kHashNotComputedMask; 85344a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85354a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org protected: 85364a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static inline bool IsHashFieldComputed(uint32_t field); 85374a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85384a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org private: 85394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Name); 85404a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}; 85414a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85424a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85434a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// ES6 symbols. 85444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgclass Symbol: public Name { 85454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org public: 8546f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // [name]: the print name of a symbol, or undefined if none. 8547f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DECL_ACCESSORS(name, Object) 8548f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 85490cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org DECL_ACCESSORS(flags, Smi) 85500cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 85510cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org // [is_private]: whether this is a private symbol. 85520cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org DECL_BOOLEAN_ACCESSORS(is_private) 85530cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 85545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // [is_own]: whether this is an own symbol, that is, only used to designate 85555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // own properties of objects. 85565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org DECL_BOOLEAN_ACCESSORS(is_own) 85575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 8558975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Symbol) 85594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Dispatched behavior. 85614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org DECLARE_PRINTER(Symbol) 85624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org DECLARE_VERIFIER(Symbol) 85634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Layout description. 8565f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org static const int kNameOffset = Name::kSize; 85660cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org static const int kFlagsOffset = kNameOffset + kPointerSize; 85670cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org static const int kSize = kFlagsOffset + kPointerSize; 8568f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 85690cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org typedef FixedBodyDescriptor<kNameOffset, kFlagsOffset, kSize> BodyDescriptor; 85704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85714a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org private: 85720cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org static const int kPrivateBit = 0; 85735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org static const int kOwnBit = 1; 85740cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 85754a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Symbol); 85764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}; 85774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 85784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 8579750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass ConsString; 8580750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 858143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The String abstract class captures JavaScript string values: 858243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 858343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Ecma-262: 858443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 4.3.16 String Value 858543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A string value is a member of the type String and is a finite 858643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ordered sequence of zero or more 16-bit unsigned integer values. 858743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 858843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All string values have a length field. 85894a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgclass String: public Name { 859043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 859132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org enum Encoding { ONE_BYTE_ENCODING, TWO_BYTE_ENCODING }; 859232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 85931845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // Array index strings this short can keep their index in the hash field. 85941845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kMaxCachedArrayIndexLength = 7; 85951845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 85961845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // For strings which are array indexes the hash value has the string length 85971845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // mixed into the hash, mainly to avoid a hash value of zero which would be 85981845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // the case for the string '0'. 24 bits are used for the array index value. 85991845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kArrayIndexValueBits = 24; 86001845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const int kArrayIndexLengthBits = 86011845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields; 86021845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 86031845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org STATIC_ASSERT((kArrayIndexLengthBits > 0)); 86041845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 86051845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org class ArrayIndexValueBits : public BitField<unsigned int, kNofHashBitFields, 86061845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org kArrayIndexValueBits> {}; // NOLINT 86071845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org class ArrayIndexLengthBits : public BitField<unsigned int, 86081845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org kNofHashBitFields + kArrayIndexValueBits, 86091845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org kArrayIndexLengthBits> {}; // NOLINT 86101845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 86111845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we 86121845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // could use a mask to test if the length of string is less than or equal to 86131845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // kMaxCachedArrayIndexLength. 86141845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org STATIC_ASSERT(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1)); 86151845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 86161845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static const unsigned int kContainsCachedArrayIndexMask = 86173e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org (~static_cast<unsigned>(kMaxCachedArrayIndexLength) 86183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org << ArrayIndexLengthBits::kShift) | 86191845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org kIsNotArrayIndexMask; 86201845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 8621ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // Representation of the flat content of a String. 8622ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // A non-flat string doesn't have flat content. 8623ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // A flat string has content that's encoded as a sequence of either 86242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // one-byte chars or two-byte UC16. 8625ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // Returned by String::GetFlatContent(). 8626ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org class FlatContent { 8627ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org public: 8628ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // Returns true if the string is flat and this structure contains content. 8629ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org bool IsFlat() { return state_ != NON_FLAT; } 86302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Returns true if the structure contains one-byte content. 86312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org bool IsOneByte() { return state_ == ONE_BYTE; } 8632ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // Returns true if the structure contains two-byte content. 8633ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org bool IsTwoByte() { return state_ == TWO_BYTE; } 8634ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 86352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Return the one byte content of the string. Only use if IsOneByte() 86362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // returns true. 863759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Vector<const uint8_t> ToOneByteVector() { 86382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org DCHECK_EQ(ONE_BYTE, state_); 86392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return Vector<const uint8_t>(onebyte_start, length_); 8640ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org } 8641ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // Return the two-byte content of the string. Only use if IsTwoByte() 8642ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // returns true. 8643ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org Vector<const uc16> ToUC16Vector() { 8644e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(TWO_BYTE, state_); 86452ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return Vector<const uc16>(twobyte_start, length_); 86462ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 86472ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 86482ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org uc16 Get(int i) { 8649e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(i < length_); 8650e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(state_ != NON_FLAT); 86512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (state_ == ONE_BYTE) return onebyte_start[i]; 86522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return twobyte_start[i]; 8653ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org } 8654ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 8655ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org private: 86562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org enum State { NON_FLAT, ONE_BYTE, TWO_BYTE }; 8657ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 8658ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // Constructors only used by String::GetFlatContent(). 86592ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org explicit FlatContent(const uint8_t* start, int length) 86602c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org : onebyte_start(start), length_(length), state_(ONE_BYTE) {} 86612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org explicit FlatContent(const uc16* start, int length) 86622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org : twobyte_start(start), length_(length), state_(TWO_BYTE) { } 86632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org FlatContent() : onebyte_start(NULL), length_(0), state_(NON_FLAT) { } 86642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 86652ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org union { 86662ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org const uint8_t* onebyte_start; 86672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org const uc16* twobyte_start; 86682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org }; 86692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org int length_; 8670ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org State state_; 8671ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 8672ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org friend class String; 8673ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org }; 8674ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 867543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get and set the length of the string. 86764b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int length() const; 867743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_length(int value); 867843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 867963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org // Get and set the length of the string using acquire loads and release 868063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org // stores. 86814b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int synchronized_length() const; 868263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org inline void synchronized_set_length(int value); 868363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org 86842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Returns whether this string has only one-byte chars, i.e. all of them can 86852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // be one-byte encoded. This might be the case even if the string is 86865ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // two-byte. Such strings may appear when the embedder prefers 86872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // two-byte external representations even for one-byte data. 868808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inline bool IsOneByteRepresentation() const; 868908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inline bool IsTwoByteRepresentation() const; 86904668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 86914668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Cons and slices have an encoding flag that may not represent the actual 86924668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // encoding of the underlying string. This is taken into account here. 86934668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Requires: this->IsFlat() 86948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org inline bool IsOneByteRepresentationUnderneath(); 86954668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org inline bool IsTwoByteRepresentationUnderneath(); 86964668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 86975ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // NOTE: this should be considered only a hint. False negatives are 86985ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // possible. 8699ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org inline bool HasOnlyOneByteChars(); 8700aa1b6165f7efc4a40c71aa4cb22966c480108fa5ricow@chromium.org 870143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get and set individual two byte chars in the string. 8702bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org inline void Set(int index, uint16_t value); 870343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get individual two byte char in the string. Repeated calls 870443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // to this method are not efficient unless the string is flat. 8705212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org INLINE(uint16_t Get(int index)); 870643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 87072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Flattens the string. Checks first inline to see if it is 87089dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // necessary. Does nothing if the string is not a cons string. 87099dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Flattening allocates a sequential string with the same data as 87109dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // the given string and mutates the cons string to a degenerate 87119dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // form, where the first component is the new sequential string and 87129dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // the second component is the empty string. If allocation fails, 87139dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // this function returns a failure. If flattening succeeds, this 87149dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // function returns the sequential string that is now the first 87159dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // component of the cons string. 87169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // 87179dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Degenerate cons strings are handled specially by the garbage 87189dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // collector (see IsShortcutCandidate). 87199dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 87209e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static inline Handle<String> Flatten(Handle<String> string, 87219e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org PretenureFlag pretenure = NOT_TENURED); 87229e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 8723ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // Tries to return the content of a flat string as a structure holding either 8724ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // a flat vector of char or of uc16. 8725ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // If the string isn't flat, and therefore doesn't have flat content, the 8726ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // returned structure will report so, and can't provide a vector of either 8727ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // kind. 8728ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org FlatContent GetFlatContent(); 87297c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 87304668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Returns the parent of a sliced string or first part of a flat cons string. 87314668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Requires: StringShape(this).IsIndirect() && this->IsFlat() 87324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org inline String* GetUnderlying(); 87334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 873443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Mark the string as an undetectable object. It only applies to 87352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // one-byte and two-byte string types. 873643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool MarkAsUndetectable(); 873743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 873843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // String equality operations. 873943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool Equals(String* other); 87402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org inline static bool Equals(Handle<String> one, Handle<String> two); 8741906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org bool IsUtf8EqualTo(Vector<const char> str, bool allow_prefix_match = false); 874259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool IsOneByteEqualTo(Vector<const uint8_t> str); 87439e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org bool IsTwoByteEqualTo(Vector<const uc16> str); 874443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 874543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return a UTF8 representation of the string. The string is null 874643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // terminated but may optionally contain nulls. Length is returned 874743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // in length_output if length_output is not a null pointer The string 874843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // should be nearly flat, otherwise the performance of this method may 874943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // be very slow (quadratic in the length). Setting robustness_flag to 875043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust This means it 875143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // handles unexpected data without causing assert failures and it does not 875243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // do any heap allocations. This is useful when printing stack traces. 875383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org SmartArrayPointer<char> ToCString(AllowNullsFlag allow_nulls, 875483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org RobustnessFlag robustness_flag, 875583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org int offset, 875683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org int length, 875783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org int* length_output = 0); 875883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org SmartArrayPointer<char> ToCString( 875943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen AllowNullsFlag allow_nulls = DISALLOW_NULLS, 876043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL, 876143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int* length_output = 0); 876243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 876343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return a 16 bit Unicode representation of the string. 876443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The string should be nearly flat, otherwise the performance of 876543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // of this method may be very bad. Setting robustness_flag to 876643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust This means it 876743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // handles unexpected data without causing assert failures and it does not 876843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // do any heap allocations. This is useful when printing stack traces. 876983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org SmartArrayPointer<uc16> ToWideCString( 8770b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL); 877143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 87724cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org bool ComputeArrayIndex(uint32_t* index); 877343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 87746f10e41fef1524c70846d970268de222e41c594cager@chromium.org // Externalization. 87756f10e41fef1524c70846d970268de222e41c594cager@chromium.org bool MakeExternal(v8::String::ExternalStringResource* resource); 87762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org bool MakeExternal(v8::String::ExternalOneByteStringResource* resource); 87776f10e41fef1524c70846d970268de222e41c594cager@chromium.org 877843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Conversion. 877943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool AsArrayIndex(uint32_t* index); 878043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8781975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(String) 878243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 878343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintOn(FILE* out); 878443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 878543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // For use during stack traces. Performs rudimentary sanity check. 878643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool LooksValid(); 878743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 878843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 878943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void StringShortPrint(StringStream* accumulator); 8790f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void PrintUC16(OStream& os, int start = 0, int end = -1); // NOLINT 8791023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#ifdef OBJECT_PRINT 87927943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org char* ToAsciiArray(); 8793023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org#endif 8794dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org DECLARE_PRINTER(String) 8795c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(String) 8796c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 8797bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org inline bool IsFlat(); 879843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 879943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 88004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kLengthOffset = Name::kSize; 88014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kSize = kLengthOffset + kPointerSize; 880243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Maximum number of characters to consider when trying to convert a string 88043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // value into an array index. 88057c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org static const int kMaxArrayIndexSize = 10; 8806d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kMaxArrayIndexSize < (1 << kArrayIndexLengthBits)); 88077c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 880859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // Max char codes. 880959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org static const int32_t kMaxOneByteCharCode = unibrow::Latin1::kMaxChar; 881059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org static const uint32_t kMaxOneByteCharCodeU = unibrow::Latin1::kMaxChar; 8811154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org static const int kMaxUtf16CodeUnit = 0xffff; 8812b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org static const uint32_t kMaxUtf16CodeUnitU = kMaxUtf16CodeUnit; 88135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 881430ce411529579186181838984710b0b0980857aaricow@chromium.org // Value of hash field containing computed hash equal to zero. 881589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org static const int kEmptyStringHash = kIsNotArrayIndexMask; 8816ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 8817ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org // Maximal string length. 881886b1631344aedfc4be5dcd5237e28d0b28e5974emachenbach@chromium.org static const int kMaxLength = (1 << 28) - 16; 88193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 8820ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org // Max length for computing hash. For strings longer than this limit the 8821ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org // string length is used as the hash value. 8822ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org static const int kMaxHashCalcLength = 16383; 88237c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 88247276f14ca716596e0a0d17539516370c1f453847kasper.lund // Limit for truncation in short printing. 88257276f14ca716596e0a0d17539516370c1f453847kasper.lund static const int kMaxShortPrintLength = 1024; 88267276f14ca716596e0a0d17539516370c1f453847kasper.lund 882743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Support for regular expressions. 882843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const uc16* GetTwoByteData(unsigned start); 882943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 883043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Helper function for flattening strings. 88315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org template <typename sinkchar> 88325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org static void WriteToFlat(String* source, 88335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org sinkchar* sink, 88345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int from, 88355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int to); 883643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88372c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // The return value may point to the first aligned word containing the first 88382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // non-one-byte character, rather than directly to the non-one-byte character. 88392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // If the return value is >= the passed length, the entire string was 88402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // one-byte. 884189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org static inline int NonAsciiStart(const char* chars, int length) { 884289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org const char* start = chars; 88439e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org const char* limit = chars + length; 88449e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org 88459e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (length >= kIntptrSize) { 88469e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // Check unaligned bytes. 88479e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org while (!IsAligned(reinterpret_cast<intptr_t>(chars), sizeof(uintptr_t))) { 88489e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { 88499e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org return static_cast<int>(chars - start); 88509e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 88519e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org ++chars; 88529e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 88539e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // Check aligned words. 88549e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org DCHECK(unibrow::Utf8::kMaxOneByteChar == 0x7F); 88559e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org const uintptr_t non_one_byte_mask = kUintptrAllBitsSet / 0xFF * 0x80; 88569e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org while (chars + sizeof(uintptr_t) <= limit) { 88579e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (*reinterpret_cast<const uintptr_t*>(chars) & non_one_byte_mask) { 88589e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org return static_cast<int>(chars - start); 88599e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 88609e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org chars += sizeof(uintptr_t); 88619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 88629e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 88639e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // Check remaining unaligned bytes. 88649e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org while (chars < limit) { 886559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { 886689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return static_cast<int>(chars - start); 886789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org } 88689e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org ++chars; 88699e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 88709e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org 887189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return static_cast<int>(chars - start); 88729e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 88739e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 887489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org static inline bool IsAscii(const char* chars, int length) { 887589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return NonAsciiStart(chars, length) >= length; 887689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org } 887789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 887859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org static inline bool IsAscii(const uint8_t* chars, int length) { 887959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return 888059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org NonAsciiStart(reinterpret_cast<const char*>(chars), length) >= length; 888159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 888259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 888359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org static inline int NonOneByteStart(const uc16* chars, int length) { 88849e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org const uc16* limit = chars + length; 888589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org const uc16* start = chars; 88869e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org while (chars < limit) { 888759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (*chars > kMaxOneByteCharCodeU) return static_cast<int>(chars - start); 88889e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org ++chars; 88899e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 889089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return static_cast<int>(chars - start); 889189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org } 889289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org 889359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org static inline bool IsOneByte(const uc16* chars, int length) { 889459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return NonOneByteStart(chars, length) >= length; 88959e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 88969e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 8897750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org template<class Visitor> 8898750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline ConsString* VisitFlat(Visitor* visitor, 8899750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org String* string, 89003484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int offset = 0); 8901750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 89029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static Handle<FixedArray> CalculateLineEnds(Handle<String> string, 89039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org bool include_ending_line); 89049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 89057c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org // Use the hash field to forward to the canonical internalized string 89067c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org // when deserializing an internalized string. 89077c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org inline void SetForwardedInternalizedString(String* string); 89087c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org inline String* GetForwardedInternalizedString(); 89097c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 891043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 89114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org friend class Name; 8912d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org friend class StringTableInsertionKey; 89134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 89142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static Handle<String> SlowFlatten(Handle<ConsString> cons, 89152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org PretenureFlag tenure); 89169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 891743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Slow case of String::Equals. This implementation works on any strings 891843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // but it is most efficient on strings that are almost flat. 8919bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org bool SlowEquals(String* other); 892043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static bool SlowEquals(Handle<String> one, Handle<String> two); 89222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 892343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Slow case of AsArrayIndex. 892443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool SlowAsArrayIndex(uint32_t* index); 892543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 892643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Compute and set the hash code. 892743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uint32_t ComputeAndSetHash(); 892843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 892943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(String); 893043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 893143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 893243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 893343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The SeqString abstract class captures sequential string values. 893443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass SeqString: public String { 893543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 8936975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(SeqString) 893743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8938c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Layout description. 8939c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kHeaderSize = String::kSize; 8940c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 894132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org // Truncate the string in-place if possible and return the result. 894232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org // In case of new_length == 0, the empty string is returned without 894332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org // truncating the original string. 8944f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org MUST_USE_RESULT static Handle<String> Truncate(Handle<SeqString> string, 8945f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org int new_length); 894643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 894743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(SeqString); 894843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 894943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 895043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// The OneByteString class captures sequential one-byte string objects. 89522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// Each character in the OneByteString is an one-byte character. 8953fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgclass SeqOneByteString: public SeqString { 895443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 89552c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static const bool kHasOneByteEncoding = true; 89564a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 895743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 8958fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org inline uint16_t SeqOneByteStringGet(int index); 8959fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org inline void SeqOneByteStringSet(int index, uint16_t value); 896043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 896143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the address of the characters in this string. 896243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline Address GetCharsAddress(); 896343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 896459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org inline uint8_t* GetChars(); 89655a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 8966975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(SeqOneByteString) 896743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 896843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Garbage collection support. This method is called by the 89692c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // garbage collector to compute the actual size of an OneByteString 897043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // instance. 8971fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org inline int SeqOneByteStringSize(InstanceType instance_type); 897243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Computes the size for an OneByteString instance of a given length. 897443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int SizeFor(int length) { 897530ce411529579186181838984710b0b0980857aaricow@chromium.org return OBJECT_POINTER_ALIGN(kHeaderSize + length * kCharSize); 897643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 897743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Maximal memory usage for a single sequential one-byte string. 8979c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kMaxSize = 512 * MB - 1; 8980d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT((kMaxSize - kHeaderSize) >= String::kMaxLength); 89810c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 898243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 8983fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(SeqOneByteString); 898443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 898543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 898643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 898743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The TwoByteString class captures sequential unicode string objects. 898843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Each character in the TwoByteString is a two-byte uint16_t. 89897c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgclass SeqTwoByteString: public SeqString { 899043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 89912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static const bool kHasOneByteEncoding = false; 89924a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 899343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 89947c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org inline uint16_t SeqTwoByteStringGet(int index); 89957c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org inline void SeqTwoByteStringSet(int index, uint16_t value); 89967c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 89977c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // Get the address of the characters in this string. 89987c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org inline Address GetCharsAddress(); 899943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90005a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org inline uc16* GetChars(); 90015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 900243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // For regexp code. 90037c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org const uint16_t* SeqTwoByteStringGetData(unsigned start); 900443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9005975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(SeqTwoByteString) 900643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 900743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Garbage collection support. This method is called by the 900843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // garbage collector to compute the actual size of a TwoByteString 900943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // instance. 9010bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org inline int SeqTwoByteStringSize(InstanceType instance_type); 901143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 901243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Computes the size for a TwoByteString instance of a given length. 901343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int SizeFor(int length) { 901430ce411529579186181838984710b0b0980857aaricow@chromium.org return OBJECT_POINTER_ALIGN(kHeaderSize + length * kShortSize); 901543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 901643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90170c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Maximal memory usage for a single sequential two-byte string. 9018c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kMaxSize = 512 * MB - 1; 9019d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(static_cast<int>((kMaxSize - kHeaderSize)/sizeof(uint16_t)) >= 902086b1631344aedfc4be5dcd5237e28d0b28e5974emachenbach@chromium.org String::kMaxLength); 90210c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 902243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 90237c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(SeqTwoByteString); 902443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 902543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 902643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 902743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The ConsString class describes string values built by using the 902843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// addition operator on strings. A ConsString is a pair where the 902943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// first and second components are pointers to other string values. 903043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// One or both components of a ConsString can be pointers to other 903143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ConsStrings, creating a binary tree of ConsStrings where the leaves 903243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// are non-ConsString string values. The string value represented by 903343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// a ConsString can be obtained by concatenating the leaf string 903443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// values in a left-to-right depth-first traversal of the tree. 903543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ConsString: public String { 903643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 9037870a0b67c822d289024711912e2512af01b66c3bager@chromium.org // First string of the cons cell. 9038870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline String* first(); 9039870a0b67c822d289024711912e2512af01b66c3bager@chromium.org // Doesn't check that the result is a string, even in debug mode. This is 9040870a0b67c822d289024711912e2512af01b66c3bager@chromium.org // useful during GC where the mark bits confuse the checks. 9041870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline Object* unchecked_first(); 9042870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline void set_first(String* first, 90439fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 904443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9045870a0b67c822d289024711912e2512af01b66c3bager@chromium.org // Second string of the cons cell. 9046870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline String* second(); 9047870a0b67c822d289024711912e2512af01b66c3bager@chromium.org // Doesn't check that the result is a string, even in debug mode. This is 9048870a0b67c822d289024711912e2512af01b66c3bager@chromium.org // useful during GC where the mark bits confuse the checks. 9049870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline Object* unchecked_second(); 9050870a0b67c822d289024711912e2512af01b66c3bager@chromium.org inline void set_second(String* second, 90519fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 905243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 905343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 905443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uint16_t ConsStringGet(int index); 905543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9056975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ConsString) 905743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 905843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 905971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static const int kFirstOffset = POINTER_SIZE_ALIGN(String::kSize); 906043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSecondOffset = kFirstOffset + kPointerSize; 906143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kSecondOffset + kPointerSize; 906243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Minimum length for a cons string. 906443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kMinLength = 13; 906543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9066ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> 9067ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org BodyDescriptor; 9068ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 9069c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(ConsString) 90704668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 907143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 907243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); 907343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 907443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 907543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90764668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// The Sliced String class describes strings that are substrings of another 90774668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// sequential string. The motivation is to save time and memory when creating 90784668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// a substring. A Sliced String is described as a pointer to the parent, 90794668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// the offset from the start of the parent string and the length. Using 90804668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// a Sliced String therefore requires unpacking of the parent string and 90814668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// adding the offset to the start address. A substring of a Sliced String 90824668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// are not nested since the double indirection is simplified when creating 90834668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// such a substring. 90844668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// Currently missing features are: 90854668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// - handling externalized parent strings 90864668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// - external strings as parent 90874668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// - truncating sliced string to enable otherwise unneeded parent to be GC'ed. 90884668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgclass SlicedString: public String { 90894668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org public: 90904668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org inline String* parent(); 9091304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org inline void set_parent(String* parent, 9092304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 90934b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int offset() const; 90944668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org inline void set_offset(int offset); 90954668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 90964668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Dispatched behavior. 90974668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org uint16_t SlicedStringGet(int index); 90984668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 9099975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(SlicedString) 91004668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 91014668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Layout description. 91024668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize); 91034668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org static const int kOffsetOffset = kParentOffset + kPointerSize; 91044668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org static const int kSize = kOffsetOffset + kPointerSize; 91054668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 91064668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Minimum length for a sliced string. 91074668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org static const int kMinLength = 13; 91084668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 91094668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org typedef FixedBodyDescriptor<kParentOffset, 91104668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org kOffsetOffset + kPointerSize, kSize> 91114668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org BodyDescriptor; 91124668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 9113c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(SlicedString) 91144668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 91154668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org private: 91164668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString); 91174668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}; 91184668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 91194668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 912043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The ExternalString class describes string values that are backed by 912143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// a string resource that lies outside the V8 heap. ExternalStrings 912243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// consist of the length field common to all strings, a pointer to the 912343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// external resource. It is important to ensure (externally) that the 912443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// resource is not deallocated while the ExternalString is live in the 912543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// V8 heap. 912643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 912743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The API expects that all ExternalStrings are created through the 912843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// API. Therefore, ExternalStrings should not be used internally. 912943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ExternalString: public String { 913043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 9131975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalString) 913243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 913343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 913471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static const int kResourceOffset = POINTER_SIZE_ALIGN(String::kSize); 91351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org static const int kShortSize = kResourceOffset + kPointerSize; 91360ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry static const int kResourceDataOffset = kResourceOffset + kPointerSize; 91370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry static const int kSize = kResourceDataOffset + kPointerSize; 91380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 913971fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org static const int kMaxShortLength = 914071fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org (kShortSize - SeqString::kHeaderSize) / kCharSize; 914171fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org 91421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Return whether external string is short (data pointer is not cached). 91431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org inline bool is_short(); 914443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9145d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kResourceOffset == Internals::kStringResourceOffset); 914618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 914743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 914843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalString); 914943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 915043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 915143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// The ExternalOneByteString class is an external string backed by an 91532c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// one-byte string. 91542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgclass ExternalOneByteString : public ExternalString { 915543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 91562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static const bool kHasOneByteEncoding = true; 91574a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 91582c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org typedef v8::String::ExternalOneByteStringResource Resource; 915943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 916043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The underlying resource. 9161c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline const Resource* resource(); 9162c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void set_resource(const Resource* buffer); 916343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Update the pointer cache to the external character array. 91651b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // The cached pointer is always valid, as the external character array does = 91661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // not move during lifetime. Deserialization is the only exception, after 91671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // which the pointer cache has to be refreshed. 91681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org inline void update_data_cache(); 91691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 917059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org inline const uint8_t* GetChars(); 91710ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 917243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 91732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline uint16_t ExternalOneByteStringGet(int index); 917443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org DECLARE_CAST(ExternalOneByteString) 917643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9177c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Garbage collection support. 91782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline void ExternalOneByteStringIterateBody(ObjectVisitor* v); 9179ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 91802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org template <typename StaticVisitor> 91812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org inline void ExternalOneByteStringIterateBody(); 9182c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 918343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 91842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString); 918543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 918643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 918743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 918843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The ExternalTwoByteString class is an external string backed by a UTF-16 918943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// encoded string. 919043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ExternalTwoByteString: public ExternalString { 919143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 91922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static const bool kHasOneByteEncoding = false; 91934a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 919443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen typedef v8::String::ExternalStringResource Resource; 919543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 919643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The underlying string resource. 9197c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline const Resource* resource(); 9198c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void set_resource(const Resource* buffer); 919943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 92001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Update the pointer cache to the external character array. 92011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // The cached pointer is always valid, as the external character array does = 92021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // not move during lifetime. Deserialization is the only exception, after 92031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // which the pointer cache has to be refreshed. 92041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org inline void update_data_cache(); 92051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 92060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry inline const uint16_t* GetChars(); 92070ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 920843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 92090ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry inline uint16_t ExternalTwoByteStringGet(int index); 921043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 921143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // For regexp code. 92120ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry inline const uint16_t* ExternalTwoByteStringGetData(unsigned start); 921343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9214975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExternalTwoByteString) 921543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9216c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Garbage collection support. 9217ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org inline void ExternalTwoByteStringIterateBody(ObjectVisitor* v); 9218ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 9219ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<typename StaticVisitor> 9220ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org inline void ExternalTwoByteStringIterateBody(); 9221ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 922243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 922343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); 922443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 922543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 922643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9227c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org// Utility superclass for stack-allocated objects that must be updated 9228c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org// on gc. It provides two ways for the gc to update instances, either 9229c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org// iterating or updating after gc. 9230c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgclass Relocatable BASE_EMBEDDED { 9231c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org public: 9232ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org explicit inline Relocatable(Isolate* isolate); 9233ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline virtual ~Relocatable(); 9234c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org virtual void IterateInstance(ObjectVisitor* v) { } 9235c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org virtual void PostGarbageCollection() { } 9236c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 92373d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static void PostGarbageCollectionProcessing(Isolate* isolate); 9238c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org static int ArchiveSpacePerThread(); 92391c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org static char* ArchiveState(Isolate* isolate, char* to); 92401c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org static char* RestoreState(Isolate* isolate, char* from); 92413d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static void Iterate(Isolate* isolate, ObjectVisitor* v); 9242c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org static void Iterate(ObjectVisitor* v, Relocatable* top); 9243c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org static char* Iterate(ObjectVisitor* v, char* t); 92443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 9245c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org private: 9246ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate_; 9247c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org Relocatable* prev_; 9248c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}; 9249c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 9250c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 9251a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A flat string reader provides random access to the contents of a 9252a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// string independent of the character width of the string. The handle 9253a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// must be valid as long as the reader is being used. 9254c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgclass FlatStringReader : public Relocatable { 9255a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 9256ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org FlatStringReader(Isolate* isolate, Handle<String> str); 9257ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org FlatStringReader(Isolate* isolate, Vector<const char> input); 9258c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org void PostGarbageCollection(); 9259a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org inline uc32 Get(int index); 9260a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int length() { return length_; } 9261a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 9262a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org String** str_; 92632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org bool is_one_byte_; 9264a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int length_; 9265a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const void* start_; 9266a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 9267a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 9268a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 9269a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org// A ConsStringOp that returns null. 9270a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org// Useful when the operation to apply on a ConsString 9271a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org// requires an expensive data structure. 9272a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgclass ConsStringNullOp { 9273a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org public: 9274a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline ConsStringNullOp() {} 9275a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static inline String* Operate(String*, unsigned*, int32_t*, unsigned*); 9276a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org private: 9277a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DISALLOW_COPY_AND_ASSIGN(ConsStringNullOp); 9278a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}; 9279a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 9280a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 928132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org// This maintains an off-stack representation of the stack frames required 928232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org// to traverse a ConsString, allowing an entirely iterative and restartable 928332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org// traversal of the entire string 928432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgclass ConsStringIteratorOp { 928543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 928632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org inline ConsStringIteratorOp() {} 928731c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org inline explicit ConsStringIteratorOp(ConsString* cons_string, 928831c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org int offset = 0) { 92893484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Reset(cons_string, offset); 92903484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org } 92913484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org inline void Reset(ConsString* cons_string, int offset = 0) { 92923484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org depth_ = 0; 92933484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org // Next will always return NULL. 92943484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org if (cons_string == NULL) return; 92953484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Initialize(cons_string, offset); 92963484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org } 92973484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org // Returns NULL when complete. 92983484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org inline String* Next(int* offset_out) { 92993484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org *offset_out = 0; 93003484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org if (depth_ == 0) return NULL; 93013484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org return Continue(offset_out); 93023484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org } 930332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 930432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org private: 93053484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org static const int kStackSize = 32; 930632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org // Use a mask instead of doing modulo operations for stack wrapping. 93073484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org static const int kDepthMask = kStackSize-1; 930832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org STATIC_ASSERT(IS_POWER_OF_TWO(kStackSize)); 93093484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org static inline int OffsetForDepth(int depth); 931032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 931132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org inline void PushLeft(ConsString* string); 9312a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline void PushRight(ConsString* string); 931332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org inline void AdjustMaximumDepth(); 931432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org inline void Pop(); 93153484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org inline bool StackBlown() { return maximum_depth_ - depth_ == kStackSize; } 93163484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org void Initialize(ConsString* cons_string, int offset); 93173484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org String* Continue(int* offset_out); 93183484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org String* NextLeaf(bool* blew_stack); 93193484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org String* Search(int* offset_out); 932032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 9321a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Stack must always contain only frames for which right traversal 9322a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // has not yet been performed. 932332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org ConsString* frames_[kStackSize]; 932432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org ConsString* root_; 93253484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int depth_; 93263484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int maximum_depth_; 93273484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int consumed_; 932832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(ConsStringIteratorOp); 932932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}; 933032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 933132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 933232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgclass StringCharacterStream { 933332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org public: 9334a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline StringCharacterStream(String* string, 93354cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org ConsStringIteratorOp* op, 93363484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org int offset = 0); 933732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org inline uint16_t GetNext(); 933832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org inline bool HasMore(); 93393484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org inline void Reset(String* string, int offset = 0); 93403484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org inline void VisitOneByteString(const uint8_t* chars, int length); 93413484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org inline void VisitTwoByteString(const uint16_t* chars, int length); 934232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 934332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org private: 934432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org bool is_one_byte_; 934532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org union { 934632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org const uint8_t* buffer8_; 934732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org const uint16_t* buffer16_; 934832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org }; 934932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org const uint8_t* end_; 935032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org ConsStringIteratorOp* op_; 935132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(StringCharacterStream); 935243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 935343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 935443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 93557c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgtemplate <typename T> 93567c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgclass VectorIterator { 93577c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org public: 93587c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org VectorIterator(T* d, int l) : data_(Vector<const T>(d, l)), index_(0) { } 93597c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org explicit VectorIterator(Vector<const T> data) : data_(data), index_(0) { } 93607c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org T GetNext() { return data_[index_++]; } 93617c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org bool has_more() { return index_ < data_.length(); } 93627c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org private: 93637c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org Vector<const T> data_; 93647c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org int index_; 93657c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}; 93667c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 93677c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 936843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The Oddball describes objects null, undefined, true, and false. 936943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Oddball: public HeapObject { 937043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 937143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [to_string]: Cached to_string computed at startup. 937243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(to_string, String) 937343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 937443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [to_number]: Cached to_number computed at startup. 937543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(to_number, Object) 937643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 937708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inline byte kind() const; 9378ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void set_kind(byte kind); 9379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 9380975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Oddball) 938143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 938243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 9383c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(Oddball) 938443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 938543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize the fields. 93869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org static void Initialize(Isolate* isolate, 93879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Oddball> oddball, 93889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org const char* to_string, 93899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Object> to_number, 93909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org byte kind); 939143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 939243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 9393236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kToStringOffset = HeapObject::kHeaderSize; 939443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kToNumberOffset = kToStringOffset + kPointerSize; 9395ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const int kKindOffset = kToNumberOffset + kPointerSize; 9396ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const int kSize = kKindOffset + kPointerSize; 9397ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 9398ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const byte kFalse = 0; 9399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const byte kTrue = 1; 9400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const byte kNotBooleanMask = ~1; 9401ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const byte kTheHole = 2; 9402ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const byte kNull = 3; 9403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const byte kArgumentMarker = 4; 9404ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const byte kUndefined = 5; 94051fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org static const byte kUninitialized = 6; 94061fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org static const byte kOther = 7; 9407a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org static const byte kException = 8; 940843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9409ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef FixedBodyDescriptor<kToStringOffset, 9410ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kToNumberOffset + kPointerSize, 9411ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kSize> BodyDescriptor; 9412ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 9413d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kKindOffset == Internals::kOddballKindOffset); 9414d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kNull == Internals::kNullOddballKind); 9415d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kUndefined == Internals::kUndefinedOddballKind); 9416fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 941743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 941843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(Oddball); 941943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 942043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 942143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 942241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgclass Cell: public HeapObject { 94232abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org public: 94242abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // [value]: value of the global property. 94252abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org DECL_ACCESSORS(value, Object) 94262abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 9427975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Cell) 94282abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 942941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static inline Cell* FromValueAddress(Address value) { 943041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Object* result = FromAddress(value - kValueOffset); 9431e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(result->IsCell() || result->IsPropertyCell()); 943241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return static_cast<Cell*>(result); 9433000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org } 9434000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 9435000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org inline Address ValueAddress() { 9436000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org return address() + kValueOffset; 9437000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org } 9438000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 9439a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 944041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org DECLARE_PRINTER(Cell) 944141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org DECLARE_VERIFIER(Cell) 9442c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 94432abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // Layout description. 94442abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org static const int kValueOffset = HeapObject::kHeaderSize; 94452abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org static const int kSize = kValueOffset + kPointerSize; 94462abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 9447ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef FixedBodyDescriptor<kValueOffset, 9448ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kValueOffset + kPointerSize, 9449ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kSize> BodyDescriptor; 9450ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 94512abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org private: 945241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Cell); 945341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}; 945441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 945541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 9456b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgclass PropertyCell: public Cell { 945741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org public: 94581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // [type]: type of the global property. 94596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapType* type(); 94606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void set_type(HeapType* value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 946141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 94621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // [dependent_code]: dependent code that depends on the type of the global 94631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // property. 94641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DECL_ACCESSORS(dependent_code, DependentCode) 94651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9466e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // Sets the value of the cell and updates the type field to be the union 9467e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // of the cell's current type and the value's type. If the change causes 9468e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // a change of the type of the cell's contents, code dependent on the cell 9469e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // will be deoptimized. 9470528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org static void SetValueInferType(Handle<PropertyCell> cell, 947171f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org Handle<Object> value); 947271f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 947371f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org // Computes the new type of the cell's contents for the given value, but 947471f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org // without actually modifying the 'type' field. 94756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org static Handle<HeapType> UpdatedType(Handle<PropertyCell> cell, 94766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Handle<Object> value); 947771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 9478e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org static void AddDependentCompilationInfo(Handle<PropertyCell> cell, 9479e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org CompilationInfo* info); 9480e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 9481975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(PropertyCell) 948241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 948341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org inline Address TypeAddress() { 948441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return address() + kTypeOffset; 948541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 948641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 948741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Dispatched behavior. 9488b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org DECLARE_PRINTER(PropertyCell) 9489b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org DECLARE_VERIFIER(PropertyCell) 949041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 949141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Layout description. 949241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static const int kTypeOffset = kValueOffset + kPointerSize; 94931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kDependentCodeOffset = kTypeOffset + kPointerSize; 94941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kSize = kDependentCodeOffset + kPointerSize; 94951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 94961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kPointerFieldsBeginOffset = kValueOffset; 94971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kPointerFieldsEndOffset = kDependentCodeOffset; 94981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 94991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org typedef FixedBodyDescriptor<kValueOffset, 95001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kSize, 95011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kSize> BodyDescriptor; 950241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 950341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org private: 950441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org DECL_ACCESSORS(type_raw, Object) 9505b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(PropertyCell); 95062abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}; 95072abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 95082abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 95097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// The JSProxy describes EcmaScript Harmony proxies 9510d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgclass JSProxy: public JSReceiver { 95117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org public: 95127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // [handler]: The handler property. 95137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org DECL_ACCESSORS(handler, Object) 95147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9515c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // [hash]: The hash code property (undefined if not initialized yet). 9516c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com DECL_ACCESSORS(hash, Object) 9517c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 9518975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSProxy) 95197304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 95202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithHandler( 95212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<JSProxy> proxy, 95222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Object> receiver, 95232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Name> name); 95242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MUST_USE_RESULT static inline MaybeHandle<Object> GetElementWithHandler( 95252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<JSProxy> proxy, 95262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Object> receiver, 9527c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com uint32_t index); 9528717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 95297028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // If the handler defines an accessor property with a setter, invoke it. 95307028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // If it defines an accessor property without a setter, or a data property 95317028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // that is read-only, throw. In all these cases set '*done' to true, 95327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // otherwise set it to false. 95339e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT 95349e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org static MaybeHandle<Object> SetPropertyViaPrototypesWithHandler( 9535474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<JSProxy> proxy, Handle<Object> receiver, Handle<Name> name, 9536474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<Object> value, StrictMode strict_mode, bool* done); 9537d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 9538eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> 9539eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetPropertyAttributesWithHandler(Handle<JSProxy> proxy, 9540eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Object> receiver, 9541eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<Name> name); 9542eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<PropertyAttributes> 9543eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org GetElementAttributeWithHandler(Handle<JSProxy> proxy, 9544eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSReceiver> receiver, 9545eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org uint32_t index); 9546474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithHandler( 9547474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<JSProxy> proxy, Handle<Object> receiver, Handle<Name> name, 9548474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Handle<Object> value, StrictMode strict_mode); 9549c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 95508fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org // Turn the proxy into an (empty) JSObject. 95518fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org static void Fix(Handle<JSProxy> proxy); 9552717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 955334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Initializes the body after the handler slot. 955434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org inline void InitializeBody(int object_size, Object* value); 955534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 9556c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Invoke a trap by name. If the trap does not exist on this's handler, 9557c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // but derived_trap is non-NULL, invoke that instead. May cause GC. 95589e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> CallTrap( 95599e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSProxy> proxy, 95609e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org const char* name, 95619e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> derived_trap, 95629e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org int argc, 95639e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> args[]); 9564c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 95657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Dispatched behavior. 9566a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSProxy) 9567c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSProxy) 95687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9569717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // Layout description. We add padding so that a proxy has the same 9570717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // size as a virgin JSObject. This is essential for becoming a JSObject 9571717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // upon freeze. 95727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org static const int kHandlerOffset = HeapObject::kHeaderSize; 9573c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kHashOffset = kHandlerOffset + kPointerSize; 9574c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kPaddingOffset = kHashOffset + kPointerSize; 957534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kSize = JSObject::kHeaderSize; 957634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kHeaderSize = kPaddingOffset; 957734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kPaddingSize = kSize - kPaddingOffset; 9578717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 9579d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kPaddingSize >= 0); 95807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 95817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org typedef FixedBodyDescriptor<kHandlerOffset, 9582c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com kPaddingOffset, 95837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org kSize> BodyDescriptor; 95847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 95857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org private: 9586ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org friend class JSReceiver; 9587ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 95882ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MUST_USE_RESULT static inline MaybeHandle<Object> SetElementWithHandler( 95899e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSProxy> proxy, 95909e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSReceiver> receiver, 95919e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org uint32_t index, 95929e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Object> value, 95939e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org StrictMode strict_mode); 95948fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 9595eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static Maybe<bool> HasPropertyWithHandler( 9596eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSProxy> proxy, Handle<Name> name); 9597eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org MUST_USE_RESULT static inline Maybe<bool> HasElementWithHandler( 9598eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org Handle<JSProxy> proxy, uint32_t index); 9599528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 96009e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyWithHandler( 96019e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSProxy> proxy, 96029e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<Name> name, 96039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org DeleteMode mode); 96049e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> DeleteElementWithHandler( 96059e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<JSProxy> proxy, 96069e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org uint32_t index, 96079e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org DeleteMode mode); 9608ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9609057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org MUST_USE_RESULT Object* GetIdentityHash(); 9610057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 96113c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static Handle<Smi> GetOrCreateIdentityHash(Handle<JSProxy> proxy); 96128fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 96137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy); 96147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}; 96157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 96167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9617d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgclass JSFunctionProxy: public JSProxy { 9618d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org public: 961934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // [call_trap]: The call trap. 962034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org DECL_ACCESSORS(call_trap, Object) 962134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 962234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // [construct_trap]: The construct trap. 962334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org DECL_ACCESSORS(construct_trap, Object) 962434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 9625975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSFunctionProxy) 9626d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 962734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Dispatched behavior. 9628a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSFunctionProxy) 9629c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSFunctionProxy) 963034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 963134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Layout description. 9632c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kCallTrapOffset = JSProxy::kPaddingOffset; 963334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kConstructTrapOffset = kCallTrapOffset + kPointerSize; 963434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kPaddingOffset = kConstructTrapOffset + kPointerSize; 963534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kSize = JSFunction::kSize; 963634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org static const int kPaddingSize = kSize - kPaddingOffset; 963734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 9638d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kPaddingSize >= 0); 963934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 964034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org typedef FixedBodyDescriptor<kHandlerOffset, 964134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org kConstructTrapOffset + kPointerSize, 964234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org kSize> BodyDescriptor; 964334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 9644d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org private: 9645d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunctionProxy); 9646d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}; 9647d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 96482abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 964970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.orgclass JSCollection : public JSObject { 9650394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com public: 965170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org // [table]: the backing hash table 9652394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com DECL_ACCESSORS(table, Object) 9653394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 965470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org static const int kTableOffset = JSObject::kHeaderSize; 965570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org static const int kSize = kTableOffset + kPointerSize; 965670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 965770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org private: 965870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSCollection); 965970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org}; 966070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 966170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 966270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org// The JSSet describes EcmaScript Harmony sets 966370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.orgclass JSSet : public JSCollection { 966470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org public: 9665975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSSet) 9666394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 9667a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 9668a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSSet) 9669c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSSet) 9670394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 9671394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com private: 9672394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com DISALLOW_IMPLICIT_CONSTRUCTORS(JSSet); 9673394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}; 9674394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 9675394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 9676394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// The JSMap describes EcmaScript Harmony maps 967770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.orgclass JSMap : public JSCollection { 9678394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com public: 9679975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSMap) 9680394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 9681a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 9682a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSMap) 9683c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSMap) 9684394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 9685394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com private: 9686394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com DISALLOW_IMPLICIT_CONSTRUCTORS(JSMap); 9687394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}; 9688394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 9689394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 96904ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org// OrderedHashTableIterator is an iterator that iterates over the keys and 96914ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org// values of an OrderedHashTable. 96924ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org// 96936a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// The iterator has a reference to the underlying OrderedHashTable data, 96946a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// [table], as well as the current [index] the iterator is at. 96954ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org// 96966a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// When the OrderedHashTable is rehashed it adds a reference from the old table 96976a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// to the new table as well as storing enough data about the changes so that the 96986a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// iterator [index] can be adjusted accordingly. 96994ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org// 97006a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// When the [Next] result from the iterator is requested, the iterator checks if 97016a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org// there is a newer table that it needs to transition to. 97024ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgtemplate<class Derived, class TableType> 97034ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgclass OrderedHashTableIterator: public JSObject { 97044ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org public: 97054ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // [table]: the backing hash table mapping keys to values. 97064ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DECL_ACCESSORS(table, Object) 97074ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97084ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // [index]: The index into the data table. 97095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org DECL_ACCESSORS(index, Object) 97104ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97114ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // [kind]: The kind of iteration this is. One of the [Kind] enum values. 97125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org DECL_ACCESSORS(kind, Object) 97134ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97144ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org#ifdef OBJECT_PRINT 9715f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org void OrderedHashTableIteratorPrint(OStream& os); // NOLINT 97164ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org#endif 97174ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97184ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org static const int kTableOffset = JSObject::kHeaderSize; 97194ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org static const int kIndexOffset = kTableOffset + kPointerSize; 97206a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org static const int kKindOffset = kIndexOffset + kPointerSize; 97216a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org static const int kSize = kKindOffset + kPointerSize; 97224ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97234ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org enum Kind { 97244ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org kKindKeys = 1, 97254ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org kKindValues = 2, 97264ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org kKindEntries = 3 97274ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org }; 97284ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 972947390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Whether the iterator has more elements. This needs to be called before 973047390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // calling |CurrentKey| and/or |CurrentValue|. 973147390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org bool HasMore(); 973247390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org 973347390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Move the index forward one. 973447390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org void MoveNext() { 973547390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org set_index(Smi::FromInt(Smi::cast(index())->value() + 1)); 973647390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org } 973747390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org 973847390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Populates the array with the next key and value and then moves the iterator 973947390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // forward. 974047390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // This returns the |kind| or 0 if the iterator is already at the end. 974147390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org Smi* Next(JSArray* value_array); 974247390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org 974347390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Returns the current key of the iterator. This should only be called when 974447390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // |HasMore| returns true. 974547390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org inline Object* CurrentKey(); 97464ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97474ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org private: 974847390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Transitions the iterator to the non obsolete backing store. This is a NOP 97496a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org // if the [table] is not obsolete. 97506a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org void Transition(); 97514ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97524ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(OrderedHashTableIterator); 97534ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org}; 97544ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97554ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97564ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgclass JSSetIterator: public OrderedHashTableIterator<JSSetIterator, 97574ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org OrderedHashSet> { 97584ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org public: 97594ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // Dispatched behavior. 97604ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DECLARE_PRINTER(JSSetIterator) 97614ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DECLARE_VERIFIER(JSSetIterator) 97624ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 9763975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSSetIterator) 97644ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 976547390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Called by |Next| to populate the array. This allows the subclasses to 976647390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // populate the array differently. 976747390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org inline void PopulateValueArray(FixedArray* array); 97684ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97694ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org private: 97704ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSSetIterator); 97714ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org}; 97724ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97734ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97744ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgclass JSMapIterator: public OrderedHashTableIterator<JSMapIterator, 97754ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org OrderedHashMap> { 97764ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org public: 97774ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // Dispatched behavior. 97784ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DECLARE_PRINTER(JSMapIterator) 97794ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DECLARE_VERIFIER(JSMapIterator) 97804ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 9781975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSMapIterator) 97824ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 978347390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Called by |Next| to populate the array. This allows the subclasses to 978447390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // populate the array differently. 978547390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org inline void PopulateValueArray(FixedArray* array); 97864ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97874ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org private: 978847390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Returns the current value of the iterator. This should only be called when 978947390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // |HasMore| returns true. 979047390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org inline Object* CurrentValue(); 979147390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org 97924ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSMapIterator); 97934ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org}; 97944ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 97954ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 9796ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Base class for both JSWeakMap and JSWeakSet 9797ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass JSWeakCollection: public JSObject { 97987c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org public: 97997c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // [table]: the backing hash table mapping keys to values. 9800c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com DECL_ACCESSORS(table, Object) 98017c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 98027c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // [next]: linked list of encountered weak maps during GC. 98037c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECL_ACCESSORS(next, Object) 98047c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 9805ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static const int kTableOffset = JSObject::kHeaderSize; 9806ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static const int kNextOffset = kTableOffset + kPointerSize; 9807ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static const int kSize = kNextOffset + kPointerSize; 9808ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9809ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org private: 9810ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection); 9811ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}; 9812ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9813ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9814ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// The JSWeakMap describes EcmaScript Harmony weak maps 9815ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass JSWeakMap: public JSWeakCollection { 9816ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org public: 9817975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSWeakMap) 98187c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 9819a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 9820a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSWeakMap) 9821c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSWeakMap) 98227c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 98237c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org private: 98247c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakMap); 98257c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org}; 98267c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 98277c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 9828ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// The JSWeakSet describes EcmaScript Harmony weak sets 9829ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass JSWeakSet: public JSWeakCollection { 9830ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org public: 9831975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSWeakSet) 9832ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9833ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org // Dispatched behavior. 9834ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DECLARE_PRINTER(JSWeakSet) 9835ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DECLARE_VERIFIER(JSWeakSet) 9836ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9837ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org private: 9838ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakSet); 9839ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}; 9840ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9841ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 9842f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgclass JSArrayBuffer: public JSObject { 9843f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org public: 984432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // [backing_store]: backing memory for this array 9845f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DECL_ACCESSORS(backing_store, void) 9846f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 9847f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // [byte_length]: length in bytes 9848f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DECL_ACCESSORS(byte_length, Object) 9849f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 9850a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org // [flags] 9851a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org DECL_ACCESSORS(flag, Smi) 9852a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 9853a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org inline bool is_external(); 9854a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org inline void set_is_external(bool value); 9855a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 9856f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org inline bool should_be_freed(); 9857f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org inline void set_should_be_freed(bool value); 9858f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org 98591fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // [weak_next]: linked list of array buffers. 98601fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DECL_ACCESSORS(weak_next, Object) 98611fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 98621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // [weak_first_array]: weak linked list of views. 98631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DECL_ACCESSORS(weak_first_view, Object) 98641fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9865975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSArrayBuffer) 9866f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 98671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // Neutering. Only neuters the buffer, not associated typed arrays. 98681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org void Neuter(); 98691fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9870f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // Dispatched behavior. 9871f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DECLARE_PRINTER(JSArrayBuffer) 9872f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DECLARE_VERIFIER(JSArrayBuffer) 9873f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 9874f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org static const int kBackingStoreOffset = JSObject::kHeaderSize; 9875f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org static const int kByteLengthOffset = kBackingStoreOffset + kPointerSize; 9876a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org static const int kFlagOffset = kByteLengthOffset + kPointerSize; 98771fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org static const int kWeakNextOffset = kFlagOffset + kPointerSize; 98781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kWeakFirstViewOffset = kWeakNextOffset + kPointerSize; 98791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kSize = kWeakFirstViewOffset + kPointerSize; 98801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 98811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org static const int kSizeWithInternalFields = 98821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize; 9883f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 9884f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org private: 9885a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org // Bit position in a flag 9886a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org static const int kIsExternalBit = 0; 9887f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org static const int kShouldBeFreed = 1; 9888a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 9889f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer); 9890f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}; 9891f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 9892f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 98931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass JSArrayBufferView: public JSObject { 9894e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public: 9895e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // [buffer]: ArrayBuffer that this typed array views. 9896e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECL_ACCESSORS(buffer, Object) 9897e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 9898e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // [byte_length]: offset of typed array in bytes. 9899e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECL_ACCESSORS(byte_offset, Object) 9900e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 9901e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // [byte_length]: length of typed array in bytes. 9902e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECL_ACCESSORS(byte_length, Object) 9903e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 99041fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // [weak_next]: linked list of typed arrays over the same array buffer. 99051fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DECL_ACCESSORS(weak_next, Object) 99061fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9907975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSArrayBufferView) 99081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DECLARE_VERIFIER(JSArrayBufferView) 99101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kBufferOffset = JSObject::kHeaderSize; 99121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kByteOffsetOffset = kBufferOffset + kPointerSize; 99131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kByteLengthOffset = kByteOffsetOffset + kPointerSize; 99141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kWeakNextOffset = kByteLengthOffset + kPointerSize; 99151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kViewSize = kWeakNextOffset + kPointerSize; 99161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 99181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void NeuterView(); 99191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 99211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBufferView); 99221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 99231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass JSTypedArray: public JSArrayBufferView { 99261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 99271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // [length]: length of typed array in elements. 99281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DECL_ACCESSORS(length, Object) 99291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99301fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // Neutering. Only neuters this typed array. 99311fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org void Neuter(); 99321fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9933975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSTypedArray) 9934e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 9935f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org ExternalArrayType type(); 993657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org size_t element_size(); 9937f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 9938895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org Handle<JSArrayBuffer> GetBuffer(); 9939895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 9940e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Dispatched behavior. 9941e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECLARE_PRINTER(JSTypedArray) 9942e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DECLARE_VERIFIER(JSTypedArray) 9943e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 99441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kLengthOffset = kViewSize + kPointerSize; 99451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kSize = kLengthOffset + kPointerSize; 9946e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 9947e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org static const int kSizeWithInternalFields = 9948e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize; 9949e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 9950e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org private: 9951895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org static Handle<JSArrayBuffer> MaterializeArrayBuffer( 9952895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org Handle<JSTypedArray> typed_array); 9953895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 9954e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSTypedArray); 9955e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}; 9956e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 9957e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 99581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass JSDataView: public JSArrayBufferView { 99591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 99601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Only neuters this DataView 99611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void Neuter(); 99621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9963975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSDataView) 99641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Dispatched behavior. 99661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DECLARE_PRINTER(JSDataView) 99671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DECLARE_VERIFIER(JSDataView) 99681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kSize = kViewSize; 99701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9971e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org static const int kSizeWithInternalFields = 9972e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize; 9973e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 99741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 99751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSDataView); 99761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 99771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 99781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9979ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org// Foreign describes objects pointing from JavaScript to C structures. 99809258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Since they cannot contain references to JS HeapObjects they can be 99819258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// placed in old_data_space. 9982ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgclass Foreign: public HeapObject { 998343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 9984ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org // [address]: field containing the address. 9985c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org inline Address foreign_address(); 9986c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org inline void set_foreign_address(Address value); 998743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9988975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(Foreign) 998943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 999043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 9991ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org inline void ForeignIterateBody(ObjectVisitor* v); 9992ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 9993ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<typename StaticVisitor> 9994ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org inline void ForeignIterateBody(); 9995ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 9996a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 9997a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(Foreign) 9998c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(Foreign) 999943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1000043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 1000143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10002c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org static const int kForeignAddressOffset = HeapObject::kHeaderSize; 10003c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org static const int kSize = kForeignAddressOffset + kPointerSize; 1000443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10005d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset); 1000618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 1000743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 10008ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign); 1000943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1001043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1001143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1001243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The JSArray describes JavaScript Arrays 1001343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Such an array can be in one of two modes: 1001443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - fast, backing storage is a FixedArray and length <= elements.length(); 1001543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Please note: push and pop can be used to grow and shrink the array. 1001643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - slow, backing storage is a HashTable with numbers as keys. 1001743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass JSArray: public JSObject { 1001843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1001943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [length]: The length property. 1002043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(length, Object) 1002143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10022b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Overload the length setter to skip write barrier when the length 10023b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // is set to a smi. This matches the set function on FixedArray. 10024b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org inline void set_length(Smi* length); 10025b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 10026b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org static void JSArrayUpdateLengthFromIndex(Handle<JSArray> array, 10027b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org uint32_t index, 10028b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Handle<Object> value); 10029b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 10030fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org static bool IsReadOnlyLengthDescriptor(Handle<Map> jsarray_map); 10031fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org static bool WouldChangeReadOnlyLength(Handle<JSArray> array, uint32_t index); 10032fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org static MaybeHandle<Object> ReadOnlyLengthError(Handle<JSArray> array); 10033fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org 1003443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize the array with the given capacity. The function may 1003543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // fail due to out-of-memory situations, but only if the requested 1003643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // capacity is non-zero. 100374452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org static void Initialize(Handle<JSArray> array, int capacity, int length = 0); 1003843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 100397ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Initializes the array to a certain length. 100407ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org inline bool AllowsSetElementsLength(); 10041fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org // Can cause GC. 100425b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org MUST_USE_RESULT static MaybeHandle<Object> SetElementsLength( 100435b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<JSArray> array, 100445b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<Object> length); 100457ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org 1004643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Set the content of the array to the content of storage. 10047fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org static inline void SetContent(Handle<JSArray> array, 10048fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org Handle<FixedArrayBase> storage); 1004943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10050975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(JSArray) 1005143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10052b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // Ensures that the fixed array backing the JSArray has at 100537be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // least the stated size. 10054b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org static inline void EnsureSize(Handle<JSArray> array, 10055b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org int minimum_size_of_backing_fixed_array); 10056b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org 10057b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // Expand the fixed array backing of a fast-case JSArray to at least 10058b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // the requested size. 10059b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org static void Expand(Handle<JSArray> array, 10060b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org int minimum_size_of_backing_fixed_array); 100617be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 1006243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Dispatched behavior. 10063a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(JSArray) 10064c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(JSArray) 1006543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10066c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org // Number of element slots to pre-allocate for an empty array. 10067c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org static const int kPreallocatedArrayElements = 4; 10068c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 1006943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Layout description. 1007043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kLengthOffset = JSObject::kHeaderSize; 1007143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kLengthOffset + kPointerSize; 1007243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1007343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1007443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(JSArray); 1007543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1007643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1007743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10078ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgHandle<Object> CacheInitialJSArrayMaps(Handle<Context> native_context, 10079ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org Handle<Map> initial_map); 10080ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 10081ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 10082b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org// JSRegExpResult is just a JSArray with a specific initial map. 10083b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org// This initial map adds in-object properties for "index" and "input" 10084b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org// properties, as assigned by RegExp.prototype.exec, which allows 10085b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org// faster creation of RegExp exec results. 10086b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org// This class just holds constants used when creating the result. 10087b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org// After creation the result must be treated as a JSArray in all regards. 10088b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.orgclass JSRegExpResult: public JSArray { 10089b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org public: 10090b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Offsets of object fields. 10091b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org static const int kIndexOffset = JSArray::kSize; 10092b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org static const int kInputOffset = kIndexOffset + kPointerSize; 10093b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org static const int kSize = kInputOffset + kPointerSize; 10094b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Indices of in-object properties. 10095b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org static const int kIndexIndex = 0; 10096b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org static const int kInputIndex = 1; 10097b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org private: 10098b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(JSRegExpResult); 10099b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org}; 10100b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 10101b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1010243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass AccessorInfo: public Struct { 1010343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1010443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(name, Object) 1010543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(flag, Smi) 101067028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org DECL_ACCESSORS(expected_receiver_type, Object) 1010743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1010843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool all_can_read(); 1010943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_all_can_read(bool value); 1011043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1011143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline bool all_can_write(); 1011243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_all_can_write(bool value); 1011343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1011443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline PropertyAttributes property_attributes(); 1011543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inline void set_property_attributes(PropertyAttributes attributes); 1011643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 101177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // Checks whether the given receiver is compatible with this accessor. 10118d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org static bool IsCompatibleReceiverType(Isolate* isolate, 10119d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org Handle<AccessorInfo> info, 10120d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org Handle<HeapType> type); 101217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org inline bool IsCompatibleReceiver(Object* receiver); 101227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 10123975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(AccessorInfo) 1012443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10125a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10126c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(AccessorInfo) 1012743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 101283d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Append all descriptors to the array that are not already there. 101293d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Return number added. 101303d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static int AppendUnique(Handle<Object> descriptors, 101313d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Handle<FixedArray> array, 101323d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org int valid_descriptors); 101337c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 101347c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org static const int kNameOffset = HeapObject::kHeaderSize; 1013543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kFlagOffset = kNameOffset + kPointerSize; 101367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org static const int kExpectedReceiverTypeOffset = kFlagOffset + kPointerSize; 101377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org static const int kSize = kExpectedReceiverTypeOffset + kPointerSize; 1013843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1013943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 10140d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org inline bool HasExpectedReceiverType() { 10141d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org return expected_receiver_type()->IsFunctionTemplateInfo(); 10142d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org } 1014343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Bit positions in flag. 10144870a0b67c822d289024711912e2512af01b66c3bager@chromium.org static const int kAllCanReadBit = 0; 1014543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kAllCanWriteBit = 1; 101468d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org class AttributesField: public BitField<PropertyAttributes, 2, 3> {}; 1014731e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager 1014831e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorInfo); 1014943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1015043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1015143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10152750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgenum AccessorDescriptorType { 10153750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kDescriptorBitmaskCompare, 10154750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kDescriptorPointerCompare, 10155750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kDescriptorPrimitiveValue, 10156750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kDescriptorObjectDereference, 10157750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kDescriptorPointerDereference, 10158750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kDescriptorPointerShift, 10159750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org kDescriptorReturnObject 10160750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10161750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10162750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10163750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstruct BitmaskCompareDescriptor { 10164750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint32_t bitmask; 10165750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint32_t compare_value; 10166750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t size; // Must be in {1,2,4}. 10167750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10168750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10169750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10170750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstruct PointerCompareDescriptor { 10171750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org void* compare_value; 10172750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10173750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10174750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10175750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstruct PrimitiveValueDescriptor { 10176750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org v8::DeclaredAccessorDescriptorDataType data_type; 10177750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t bool_offset; // Must be in [0,7], used for kDescriptorBoolType. 10178750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10179750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10180750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10181750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstruct ObjectDerefenceDescriptor { 10182750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t internal_field; 10183750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10184750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10185750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10186750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstruct PointerShiftDescriptor { 10187750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int16_t byte_offset; 10188750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10189750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10190750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10191750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstruct DeclaredAccessorDescriptorData { 10192750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org AccessorDescriptorType type; 10193750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org union { 10194750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org struct BitmaskCompareDescriptor bitmask_compare_descriptor; 10195750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org struct PointerCompareDescriptor pointer_compare_descriptor; 10196750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org struct PrimitiveValueDescriptor primitive_value_descriptor; 10197750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org struct ObjectDerefenceDescriptor object_dereference_descriptor; 10198750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org struct PointerShiftDescriptor pointer_shift_descriptor; 10199750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org }; 10200750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10201750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10202750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10203750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass DeclaredAccessorDescriptor; 10204750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10205750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10206750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass DeclaredAccessorDescriptorIterator { 10207750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public: 10208750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org explicit DeclaredAccessorDescriptorIterator( 10209750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org DeclaredAccessorDescriptor* descriptor); 10210750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org const DeclaredAccessorDescriptorData* Next(); 10211750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool Complete() const { return length_ == offset_; } 10212750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private: 10213750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint8_t* array_; 10214750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org const int length_; 10215750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int offset_; 10216750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorDescriptorIterator); 10217750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}; 10218750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 10219750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 102207c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgclass DeclaredAccessorDescriptor: public Struct { 102217c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org public: 10222750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org DECL_ACCESSORS(serialized_data, ByteArray) 102237c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 10224975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(DeclaredAccessorDescriptor) 102257c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 10226750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static Handle<DeclaredAccessorDescriptor> Create( 10227750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Isolate* isolate, 10228750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org const DeclaredAccessorDescriptorData& data, 10229750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<DeclaredAccessorDescriptor> previous); 10230750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 102317c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org // Dispatched behavior. 102327c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARE_PRINTER(DeclaredAccessorDescriptor) 102337c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARE_VERIFIER(DeclaredAccessorDescriptor) 102347c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 10235750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const int kSerializedDataOffset = HeapObject::kHeaderSize; 10236750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static const int kSize = kSerializedDataOffset + kPointerSize; 102377c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102387c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org private: 102397c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorDescriptor); 102407c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}; 102417c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102427c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102437c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgclass DeclaredAccessorInfo: public AccessorInfo { 102447c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org public: 102457c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECL_ACCESSORS(descriptor, DeclaredAccessorDescriptor) 102467c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 10247975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(DeclaredAccessorInfo) 102487c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102497c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org // Dispatched behavior. 102507c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARE_PRINTER(DeclaredAccessorInfo) 102517c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARE_VERIFIER(DeclaredAccessorInfo) 102527c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102537c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org static const int kDescriptorOffset = AccessorInfo::kSize; 102547c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org static const int kSize = kDescriptorOffset + kPointerSize; 102557c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102567c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org private: 102577c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorInfo); 102587c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}; 102597c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102607c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102617c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// An accessor must have a getter, but can have no setter. 102627c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// 102637c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// When setting a property, V8 searches accessors in prototypes. 102647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// If an accessor was found and it does not have a setter, 102657c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// the request is ignored. 102667c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// 102677c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// If the accessor in the prototype has the READ_ONLY property attribute, then 10268fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org// a new value is added to the derived object when the property is set. 102697c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// This shadows the accessor in the prototype. 102707c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgclass ExecutableAccessorInfo: public AccessorInfo { 102717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org public: 102727c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECL_ACCESSORS(getter, Object) 102737c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECL_ACCESSORS(setter, Object) 102747c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECL_ACCESSORS(data, Object) 102757c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 10276975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ExecutableAccessorInfo) 102777c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102787c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org // Dispatched behavior. 102797c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARE_PRINTER(ExecutableAccessorInfo) 102807c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DECLARE_VERIFIER(ExecutableAccessorInfo) 102817c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org static const int kGetterOffset = AccessorInfo::kSize; 102837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org static const int kSetterOffset = kGetterOffset + kPointerSize; 102847c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org static const int kDataOffset = kSetterOffset + kPointerSize; 102857c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org static const int kSize = kDataOffset + kPointerSize; 102867c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 10287e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org inline void clear_setter(); 10288e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org 102897c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org private: 102907c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(ExecutableAccessorInfo); 102917c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}; 102927c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 102937c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 10294f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Support for JavaScript accessors: A pair of a getter and a setter. Each 10295f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// accessor can either be 10296f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// * a pointer to a JavaScript function or proxy: a real accessor 10297f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// * undefined: considered an accessor by the spec, too, strangely enough 10298f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// * the hole: an accessor which has not been set 10299f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// * a pointer to a map: a transition used to ensure map sharing 10300f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comclass AccessorPair: public Struct { 10301f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public: 10302f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com DECL_ACCESSORS(getter, Object) 10303f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com DECL_ACCESSORS(setter, Object) 103041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 10305975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(AccessorPair) 10306f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 10307c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org static Handle<AccessorPair> Copy(Handle<AccessorPair> pair); 1030865a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 10309830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org Object* get(AccessorComponent component) { 10310830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org return component == ACCESSOR_GETTER ? getter() : setter(); 10311830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org } 10312830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 10313830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org void set(AccessorComponent component, Object* value) { 10314830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org if (component == ACCESSOR_GETTER) { 10315830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org set_getter(value); 10316830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org } else { 10317830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org set_setter(value); 10318830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org } 10319830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org } 10320830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 1032188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // Note: Returns undefined instead in case of a hole. 1032288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org Object* GetComponent(AccessorComponent component); 103239a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 1032488aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // Set both components, skipping arguments which are a JavaScript null. 1032588aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org void SetComponents(Object* getter, Object* setter) { 1032688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org if (!getter->IsNull()) set_getter(getter); 1032788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org if (!setter->IsNull()) set_setter(setter); 10328be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org } 10329be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 103309a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org bool ContainsAccessor() { 103319a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org return IsJSAccessor(getter()) || IsJSAccessor(setter()); 103329a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org } 103339a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 10334a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10335a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(AccessorPair) 10336c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(AccessorPair) 10337f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 10338f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const int kGetterOffset = HeapObject::kHeaderSize; 10339f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const int kSetterOffset = kGetterOffset + kPointerSize; 10340975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org static const int kSize = kSetterOffset + kPointerSize; 10341f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 10342f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com private: 103439a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // Strangely enough, in addition to functions and harmony proxies, the spec 103449a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // requires us to consider undefined as a kind of accessor, too: 103459a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // var obj = {}; 103469a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // Object.defineProperty(obj, "foo", {get: undefined}); 103479a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // assertTrue("foo" in obj); 103489a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org bool IsJSAccessor(Object* obj) { 103499a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org return obj->IsSpecFunction() || obj->IsUndefined(); 103509a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org } 103519a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org 10352f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorPair); 10353f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}; 10354f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 10355f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 1035643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass AccessCheckInfo: public Struct { 1035743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1035843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(named_callback, Object) 1035943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(indexed_callback, Object) 1036043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(data, Object) 1036143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10362975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(AccessCheckInfo) 1036343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10364a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10365a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(AccessCheckInfo) 10366c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(AccessCheckInfo) 1036743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10368236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kNamedCallbackOffset = HeapObject::kHeaderSize; 1036943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kIndexedCallbackOffset = kNamedCallbackOffset + kPointerSize; 1037043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kDataOffset = kIndexedCallbackOffset + kPointerSize; 1037143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kDataOffset + kPointerSize; 1037243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1037343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1037443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(AccessCheckInfo); 1037543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1037643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1037743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1037843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass InterceptorInfo: public Struct { 1037943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1038043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(getter, Object) 1038143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(setter, Object) 1038243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(query, Object) 1038343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(deleter, Object) 1038443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(enumerator, Object) 1038543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(data, Object) 1038643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10387975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(InterceptorInfo) 1038843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10389a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10390a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(InterceptorInfo) 10391c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(InterceptorInfo) 1039243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10393236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kGetterOffset = HeapObject::kHeaderSize; 1039443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSetterOffset = kGetterOffset + kPointerSize; 1039543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kQueryOffset = kSetterOffset + kPointerSize; 1039643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kDeleterOffset = kQueryOffset + kPointerSize; 1039743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kEnumeratorOffset = kDeleterOffset + kPointerSize; 1039843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kDataOffset = kEnumeratorOffset + kPointerSize; 1039943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kDataOffset + kPointerSize; 1040043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1040143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1040243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(InterceptorInfo); 1040343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1040443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1040543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1040643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass CallHandlerInfo: public Struct { 1040743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1040843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(callback, Object) 1040943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(data, Object) 1041043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10411975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(CallHandlerInfo) 1041243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10413a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10414a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(CallHandlerInfo) 10415c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(CallHandlerInfo) 1041643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10417236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kCallbackOffset = HeapObject::kHeaderSize; 1041843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kDataOffset = kCallbackOffset + kPointerSize; 104194a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com static const int kSize = kDataOffset + kPointerSize; 1042043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1042143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1042243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(CallHandlerInfo); 1042343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1042443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1042543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1042643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass TemplateInfo: public Struct { 1042743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1042843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(tag, Object) 1042943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(property_list, Object) 104303d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org DECL_ACCESSORS(property_accessors, Object) 1043143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10432c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(TemplateInfo) 1043343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104343d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static const int kTagOffset = HeapObject::kHeaderSize; 1043543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kPropertyListOffset = kTagOffset + kPointerSize; 104363d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static const int kPropertyAccessorsOffset = 104373d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org kPropertyListOffset + kPointerSize; 104383d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static const int kHeaderSize = kPropertyAccessorsOffset + kPointerSize; 1043905ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org 1044005ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org private: 1044143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateInfo); 1044243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1044343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1044443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1044543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass FunctionTemplateInfo: public TemplateInfo { 1044643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1044743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(serial_number, Object) 1044843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(call_code, Object) 1044943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(prototype_template, Object) 1045043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(parent_template, Object) 1045143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(named_property_handler, Object) 1045243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(indexed_property_handler, Object) 1045343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(instance_template, Object) 1045443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(class_name, Object) 1045543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(signature, Object) 1045643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(instance_call_handler, Object) 1045743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(access_check_info, Object) 1045843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(flag, Smi) 1045943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104604b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org inline int length() const; 10461a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org inline void set_length(int value); 10462a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 1046343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Following properties use flag bits. 1046443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_BOOLEAN_ACCESSORS(hidden_prototype) 1046543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_BOOLEAN_ACCESSORS(undetectable) 1046643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If the bit is set, object instances created by this function 1046743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // requires access check. 1046843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_BOOLEAN_ACCESSORS(needs_access_check) 104692c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org DECL_BOOLEAN_ACCESSORS(read_only_prototype) 10470662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org DECL_BOOLEAN_ACCESSORS(remove_prototype) 10471639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org DECL_BOOLEAN_ACCESSORS(do_not_cache) 1047243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10473975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(FunctionTemplateInfo) 1047443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10475a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10476a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(FunctionTemplateInfo) 10477c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(FunctionTemplateInfo) 1047843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1047943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSerialNumberOffset = TemplateInfo::kHeaderSize; 1048043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kCallCodeOffset = kSerialNumberOffset + kPointerSize; 1048143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kPrototypeTemplateOffset = 104823d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org kCallCodeOffset + kPointerSize; 1048343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kParentTemplateOffset = 1048443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kPrototypeTemplateOffset + kPointerSize; 1048543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kNamedPropertyHandlerOffset = 1048643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kParentTemplateOffset + kPointerSize; 1048743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kIndexedPropertyHandlerOffset = 1048843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kNamedPropertyHandlerOffset + kPointerSize; 1048943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kInstanceTemplateOffset = 1049043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kIndexedPropertyHandlerOffset + kPointerSize; 1049143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kClassNameOffset = kInstanceTemplateOffset + kPointerSize; 1049243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSignatureOffset = kClassNameOffset + kPointerSize; 10493727e995b7bba3c57fb1e5c156d386ca11894f781v static const int kInstanceCallHandlerOffset = kSignatureOffset + kPointerSize; 1049443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kAccessCheckInfoOffset = 1049543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kInstanceCallHandlerOffset + kPointerSize; 1049643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kFlagOffset = kAccessCheckInfoOffset + kPointerSize; 10497a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static const int kLengthOffset = kFlagOffset + kPointerSize; 10498a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static const int kSize = kLengthOffset + kPointerSize; 1049943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105009af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org // Returns true if |object| is an instance of this function template. 105019af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org bool IsTemplateFor(Object* object); 105029af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org bool IsTemplateFor(Map* map); 105039af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 1050443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1050543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Bit position in the flag, from least significant bit position. 1050643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kHiddenPrototypeBit = 0; 1050743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kUndetectableBit = 1; 1050843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kNeedsAccessCheckBit = 2; 105092c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org static const int kReadOnlyPrototypeBit = 3; 10510662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org static const int kRemovePrototypeBit = 4; 10511639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org static const int kDoNotCacheBit = 5; 1051231e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager 1051331e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager DISALLOW_IMPLICIT_CONSTRUCTORS(FunctionTemplateInfo); 1051443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1051543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1051643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1051743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ObjectTemplateInfo: public TemplateInfo { 1051843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1051943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(constructor, Object) 10520212ac23f8231d169b4aa6737d762099993020826kasper.lund DECL_ACCESSORS(internal_field_count, Object) 1052143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10522975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(ObjectTemplateInfo) 1052343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10524a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10525a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(ObjectTemplateInfo) 10526c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(ObjectTemplateInfo) 1052743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1052843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kConstructorOffset = TemplateInfo::kHeaderSize; 10529212ac23f8231d169b4aa6737d762099993020826kasper.lund static const int kInternalFieldCountOffset = 10530212ac23f8231d169b4aa6737d762099993020826kasper.lund kConstructorOffset + kPointerSize; 1053171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org static const int kSize = kInternalFieldCountOffset + kPointerSize; 1053243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1053343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1053443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1053543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass SignatureInfo: public Struct { 1053643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1053743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(receiver, Object) 1053843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(args, Object) 1053943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10540975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(SignatureInfo) 1054143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10542a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10543a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(SignatureInfo) 10544c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(SignatureInfo) 1054543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10546236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kReceiverOffset = Struct::kHeaderSize; 1054743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kArgsOffset = kReceiverOffset + kPointerSize; 1054843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kArgsOffset + kPointerSize; 1054943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1055043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1055143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(SignatureInfo); 1055243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1055343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1055443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1055543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass TypeSwitchInfo: public Struct { 1055643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1055743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(types, Object) 1055843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10559975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(TypeSwitchInfo) 1056043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10561a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10562a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(TypeSwitchInfo) 10563c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(TypeSwitchInfo) 1056443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10565236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kTypesOffset = Struct::kHeaderSize; 1056643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kTypesOffset + kPointerSize; 1056743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1056843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1056943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105703291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// The DebugInfo class holds additional information for a function being 1057143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// debugged. 1057243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass DebugInfo: public Struct { 1057343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 105743291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // The shared function info for the source being debugged. 1057543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(shared, SharedFunctionInfo) 1057643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Code object for the original code. 1057743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(original_code, Code) 1057843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Code object for the patched code. This code object is the code object 1057943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // currently active for the function. 1058043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(code, Code) 1058143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Fixed array holding status information for each active break point. 1058243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(break_points, FixedArray) 1058343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1058443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check if there is a break point at a code position. 1058543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool HasBreakPoint(int code_position); 1058643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the break point info object for a code position. 1058743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* GetBreakPointInfo(int code_position); 1058843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Clear a break point. 1058943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void ClearBreakPoint(Handle<DebugInfo> debug_info, 1059043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int code_position, 1059143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> break_point_object); 1059243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Set a break point. 1059343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void SetBreakPoint(Handle<DebugInfo> debug_info, int code_position, 1059443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int source_position, int statement_position, 1059543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> break_point_object); 1059643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the break point objects for a code position. 1059743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* GetBreakPointObjects(int code_position); 1059843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Find the break point info holding this break point object. 1059943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static Object* FindBreakPointInfo(Handle<DebugInfo> debug_info, 1060043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> break_point_object); 1060143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the number of break points for this function. 1060243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int GetBreakPointCount(); 1060343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10604975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(DebugInfo) 1060543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10606a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10607a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(DebugInfo) 10608c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(DebugInfo) 1060943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10610236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kSharedFunctionInfoIndex = Struct::kHeaderSize; 1061143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kOriginalCodeIndex = kSharedFunctionInfoIndex + kPointerSize; 1061243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kPatchedCodeIndex = kOriginalCodeIndex + kPointerSize; 1061343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kActiveBreakPointsCountIndex = 1061443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kPatchedCodeIndex + kPointerSize; 1061543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kBreakPointsStateIndex = 1061643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kActiveBreakPointsCountIndex + kPointerSize; 1061743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kBreakPointsStateIndex + kPointerSize; 1061843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106198d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org static const int kEstimatedNofBreakPointsInFunction = 16; 106208d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org 1062143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1062243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kNoBreakPointInfo = -1; 1062343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1062443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Lookup the index in the break_points array for a code position. 1062543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int GetBreakPointInfoIndex(int code_position); 1062643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1062743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(DebugInfo); 1062843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1062943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1063043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1063143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The BreakPointInfo class holds information for break points set in a 1063243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// function. The DebugInfo object holds a BreakPointInfo object for each code 1063343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// position with one or more break points. 1063443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass BreakPointInfo: public Struct { 1063543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1063643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The position in the code for the break point. 1063743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(code_position, Smi) 1063843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The position in the source for the break position. 1063943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(source_position, Smi) 1064043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The position in the source for the last statement before this break 1064143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // position. 1064243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(statement_position, Smi) 1064343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // List of related JavaScript break points. 1064443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DECL_ACCESSORS(break_point_objects, Object) 1064543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1064643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Removes a break point. 1064743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void ClearBreakPoint(Handle<BreakPointInfo> info, 1064843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> break_point_object); 1064943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Set a break point. 1065043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void SetBreakPoint(Handle<BreakPointInfo> info, 1065143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> break_point_object); 1065243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check if break point info has this break point object. 1065343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool HasBreakPointObject(Handle<BreakPointInfo> info, 1065443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> break_point_object); 1065543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the number of break points for this code position. 1065643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int GetBreakPointCount(); 1065743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10658975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org DECLARE_CAST(BreakPointInfo) 1065943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10660a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Dispatched behavior. 10661a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DECLARE_PRINTER(BreakPointInfo) 10662c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DECLARE_VERIFIER(BreakPointInfo) 1066343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10664236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org static const int kCodePositionIndex = Struct::kHeaderSize; 1066543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSourcePositionIndex = kCodePositionIndex + kPointerSize; 1066643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kStatementPositionIndex = 1066743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kSourcePositionIndex + kPointerSize; 1066843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kBreakPointObjectsIndex = 1066943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kStatementPositionIndex + kPointerSize; 1067043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = kBreakPointObjectsIndex + kPointerSize; 1067143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1067243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1067343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(BreakPointInfo); 1067443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1067543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1067643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1067743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DECL_BOOLEAN_ACCESSORS 1067843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DECL_ACCESSORS 10679975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#undef DECLARE_CAST 10680c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#undef DECLARE_VERIFIER 1068143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1068264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org#define VISITOR_SYNCHRONIZATION_TAGS_LIST(V) \ 106834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(kStringTable, "string_table", "(Internalized strings)") \ 1068464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kExternalStringsTable, "external_strings_table", "(External strings)") \ 1068564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kStrongRootList, "strong_root_list", "(Strong roots)") \ 10686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org V(kSmiRootList, "smi_root_list", "(Smi roots)") \ 106874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(kInternalizedString, "internalized_string", "(Internal string)") \ 1068864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kBootstrapper, "bootstrapper", "(Bootstrapper)") \ 1068964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kTop, "top", "(Isolate)") \ 1069064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kRelocatable, "relocatable", "(Relocatable)") \ 1069164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kDebug, "debug", "(Debugger)") \ 1069264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kCompilationCache, "compilationcache", "(Compilation cache)") \ 1069364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kHandleScope, "handlescope", "(Handle scope)") \ 1069464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kBuiltins, "builtins", "(Builtins)") \ 1069564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kGlobalHandles, "globalhandles", "(Global handles)") \ 10696594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org V(kEternalHandles, "eternalhandles", "(Eternal handles)") \ 1069764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kThreadManager, "threadmanager", "(Thread manager)") \ 1069864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org V(kExtensions, "Extensions", "(Extensions)") 1069964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 1070064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgclass VisitorSynchronization : public AllStatic { 1070164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org public: 1070264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org#define DECLARE_ENUM(enum_item, ignore1, ignore2) enum_item, 1070364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org enum SyncTag { 1070464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org VISITOR_SYNCHRONIZATION_TAGS_LIST(DECLARE_ENUM) 1070564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org kNumberOfSyncTags 1070664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org }; 1070764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org#undef DECLARE_ENUM 1070864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 1070964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org static const char* const kTags[kNumberOfSyncTags]; 1071064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org static const char* const kTagNames[kNumberOfSyncTags]; 1071164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}; 1071243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1071343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Abstract base class for visiting, and optionally modifying, the 1071443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// pointers contained in Objects. Used in GC and serialization/deserialization. 1071543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ObjectVisitor BASE_EMBEDDED { 1071643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1071743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual ~ObjectVisitor() {} 1071843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1071943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Visits a contiguous arrays of pointers in the half-open range 1072043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [start, end). Any or all of the values may be modified on return. 1072143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void VisitPointers(Object** start, Object** end) = 0; 1072243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10723c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org // Handy shorthand for visiting a single pointer. 10724c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); } 10725c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 10726895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org // Visit weak next_code_link in Code object. 10727895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org virtual void VisitNextCodeLink(Object** p) { VisitPointers(p, p + 1); } 10728895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 1072943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // To allow lazy clearing of inline caches the visitor has 1073043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // a rich interface for iterating over Code objects.. 1073143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1073243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Visits a code target in the instruction stream. 1073343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void VisitCodeTarget(RelocInfo* rinfo); 1073443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10735145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com // Visits a code entry in a JS function. 10736145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com virtual void VisitCodeEntry(Address entry_address); 10737145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com 10738a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Visits a global property cell reference in the instruction stream. 1073941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org virtual void VisitCell(RelocInfo* rinfo); 10740a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1074143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Visits a runtime entry in the instruction stream. 1074243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void VisitRuntimeEntry(RelocInfo* rinfo) {} 1074343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 107442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Visits the resource of an one-byte or two-byte string. 107452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org virtual void VisitExternalOneByteString( 107462c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org v8::String::ExternalOneByteStringResource** resource) {} 10747c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org virtual void VisitExternalTwoByteString( 10748c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::String::ExternalStringResource** resource) {} 10749c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1075043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Visits a debug call target in the instruction stream. 1075143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void VisitDebugTarget(RelocInfo* rinfo); 1075243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10753e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // Visits the byte sequence in a function's prologue that contains information 10754e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // about the code's age. 10755e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org virtual void VisitCodeAgeSequence(RelocInfo* rinfo); 10756e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 10757c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Visit pointer embedded into a code object. 10758b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org virtual void VisitEmbeddedPointer(RelocInfo* rinfo); 10759c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 10760c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org // Visits an external reference embedded into a code object. 1076104e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org virtual void VisitExternalReference(RelocInfo* rinfo); 1076204e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org 10763c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org // Visits an external reference. The value may be modified on return. 10764c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org virtual void VisitExternalReference(Address* p) {} 1076543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10766b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org // Visits a handle that has an embedder-assigned class ID. 10767b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {} 10768b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1076943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Intended for serialization/deserialization checking: insert, or 1077043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // check for the presence of, a tag at this position in the stream. 1077164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // Also used for marking up GC roots in heap snapshots. 1077264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org virtual void Synchronize(VisitorSynchronization::SyncTag tag) {} 1077343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1077443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1077543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10776ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass StructBodyDescriptor : public 10777ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org FlexibleBodyDescriptor<HeapObject::kHeaderSize> { 10778ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 10779ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline int SizeOf(Map* map, HeapObject* object) { 10780ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return map->instance_size(); 10781ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 10782ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 10783ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 10784ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1078543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// BooleanBit is a helper class for setting and getting a bit in an 1078643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// integer or Smi. 1078743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass BooleanBit : public AllStatic { 1078843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1078943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline bool get(Smi* smi, int bit_position) { 1079043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return get(smi->value(), bit_position); 1079143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1079243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1079343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline bool get(int value, int bit_position) { 1079443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return (value & (1 << bit_position)) != 0; 1079543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1079643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1079743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline Smi* set(Smi* smi, int bit_position, bool v) { 1079843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Smi::FromInt(set(smi->value(), bit_position, v)); 1079943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1080043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1080143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static inline int set(int value, int bit_position, bool v) { 1080243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (v) { 1080343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen value |= (1 << bit_position); 1080443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 1080543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen value &= ~(1 << bit_position); 1080643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1080743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return value; 1080843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1080943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 1081043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1081143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 1081243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1081343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_OBJECTS_H_ 10814