Do not look for the slot in the ScopeInfo's global range when it's not necessary.
[platform/upstream/v8.git] / src / objects.h
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef V8_OBJECTS_H_
6 #define V8_OBJECTS_H_
7
8 #include <iosfwd>
9
10 #include "src/allocation.h"
11 #include "src/assert-scope.h"
12 #include "src/bailout-reason.h"
13 #include "src/base/bits.h"
14 #include "src/base/smart-pointers.h"
15 #include "src/builtins.h"
16 #include "src/checks.h"
17 #include "src/elements-kind.h"
18 #include "src/field-index.h"
19 #include "src/flags.h"
20 #include "src/list.h"
21 #include "src/property-details.h"
22 #include "src/unicode.h"
23 #include "src/unicode-decoder.h"
24 #include "src/zone.h"
25
26 #if V8_TARGET_ARCH_ARM
27 #include "src/arm/constants-arm.h"  // NOLINT
28 #elif V8_TARGET_ARCH_ARM64
29 #include "src/arm64/constants-arm64.h"  // NOLINT
30 #elif V8_TARGET_ARCH_MIPS
31 #include "src/mips/constants-mips.h"  // NOLINT
32 #elif V8_TARGET_ARCH_MIPS64
33 #include "src/mips64/constants-mips64.h"  // NOLINT
34 #elif V8_TARGET_ARCH_PPC
35 #include "src/ppc/constants-ppc.h"  // NOLINT
36 #endif
37
38
39 //
40 // Most object types in the V8 JavaScript are described in this file.
41 //
42 // Inheritance hierarchy:
43 // - Object
44 //   - Smi          (immediate small integer)
45 //   - HeapObject   (superclass for everything allocated in the heap)
46 //     - JSReceiver  (suitable for property access)
47 //       - JSObject
48 //         - JSArray
49 //         - JSArrayBuffer
50 //         - JSArrayBufferView
51 //           - JSTypedArray
52 //           - JSDataView
53 //         - JSCollection
54 //           - JSSet
55 //           - JSMap
56 //         - JSSetIterator
57 //         - JSMapIterator
58 //         - JSWeakCollection
59 //           - JSWeakMap
60 //           - JSWeakSet
61 //         - JSRegExp
62 //         - JSFunction
63 //         - JSGeneratorObject
64 //         - JSModule
65 //         - GlobalObject
66 //           - JSGlobalObject
67 //           - JSBuiltinsObject
68 //         - JSGlobalProxy
69 //         - JSValue
70 //           - JSDate
71 //         - JSMessageObject
72 //       - JSProxy
73 //         - JSFunctionProxy
74 //     - FixedArrayBase
75 //       - ByteArray
76 //       - BytecodeArray
77 //       - FixedArray
78 //         - DescriptorArray
79 //         - HashTable
80 //           - Dictionary
81 //           - StringTable
82 //           - CompilationCacheTable
83 //           - CodeCacheHashTable
84 //           - MapCache
85 //         - OrderedHashTable
86 //           - OrderedHashSet
87 //           - OrderedHashMap
88 //         - Context
89 //         - TypeFeedbackVector
90 //         - ScopeInfo
91 //         - TransitionArray
92 //         - ScriptContextTable
93 //         - WeakFixedArray
94 //       - FixedDoubleArray
95 //     - Name
96 //       - String
97 //         - SeqString
98 //           - SeqOneByteString
99 //           - SeqTwoByteString
100 //         - SlicedString
101 //         - ConsString
102 //         - ExternalString
103 //           - ExternalOneByteString
104 //           - ExternalTwoByteString
105 //         - InternalizedString
106 //           - SeqInternalizedString
107 //             - SeqOneByteInternalizedString
108 //             - SeqTwoByteInternalizedString
109 //           - ConsInternalizedString
110 //           - ExternalInternalizedString
111 //             - ExternalOneByteInternalizedString
112 //             - ExternalTwoByteInternalizedString
113 //       - Symbol
114 //     - HeapNumber
115 //     - Simd128Value
116 //       - Float32x4
117 //       - Int32x4
118 //       - Uint32x4
119 //       - Bool32x4
120 //       - Int16x8
121 //       - Uint16x8
122 //       - Bool16x8
123 //       - Int8x16
124 //       - Uint8x16
125 //       - Bool8x16
126 //     - Cell
127 //     - PropertyCell
128 //     - Code
129 //     - Map
130 //     - Oddball
131 //     - Foreign
132 //     - SharedFunctionInfo
133 //     - Struct
134 //       - Box
135 //       - AccessorInfo
136 //         - ExecutableAccessorInfo
137 //       - AccessorPair
138 //       - AccessCheckInfo
139 //       - InterceptorInfo
140 //       - CallHandlerInfo
141 //       - TemplateInfo
142 //         - FunctionTemplateInfo
143 //         - ObjectTemplateInfo
144 //       - Script
145 //       - TypeSwitchInfo
146 //       - DebugInfo
147 //       - BreakPointInfo
148 //       - CodeCache
149 //       - PrototypeInfo
150 //     - WeakCell
151 //
152 // Formats of Object*:
153 //  Smi:        [31 bit signed int] 0
154 //  HeapObject: [32 bit direct pointer] (4 byte aligned) | 01
155
156 namespace v8 {
157 namespace internal {
158
159 enum KeyedAccessStoreMode {
160   STANDARD_STORE,
161   STORE_TRANSITION_TO_OBJECT,
162   STORE_TRANSITION_TO_DOUBLE,
163   STORE_AND_GROW_NO_TRANSITION,
164   STORE_AND_GROW_TRANSITION_TO_OBJECT,
165   STORE_AND_GROW_TRANSITION_TO_DOUBLE,
166   STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS,
167   STORE_NO_TRANSITION_HANDLE_COW
168 };
169
170
171 // Valid hints for the abstract operation ToPrimitive,
172 // implemented according to ES6, section 7.1.1.
173 enum class ToPrimitiveHint { kDefault, kNumber, kString };
174
175
176 // Valid hints for the abstract operation OrdinaryToPrimitive,
177 // implemented according to ES6, section 7.1.1.
178 enum class OrdinaryToPrimitiveHint { kNumber, kString };
179
180
181 enum TypeofMode { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
182
183
184 enum MutableMode {
185   MUTABLE,
186   IMMUTABLE
187 };
188
189
190 enum ExternalArrayType {
191   kExternalInt8Array = 1,
192   kExternalUint8Array,
193   kExternalInt16Array,
194   kExternalUint16Array,
195   kExternalInt32Array,
196   kExternalUint32Array,
197   kExternalFloat32Array,
198   kExternalFloat64Array,
199   kExternalUint8ClampedArray,
200 };
201
202
203 static inline bool IsTransitionStoreMode(KeyedAccessStoreMode store_mode) {
204   return store_mode == STORE_TRANSITION_TO_OBJECT ||
205          store_mode == STORE_TRANSITION_TO_DOUBLE ||
206          store_mode == STORE_AND_GROW_TRANSITION_TO_OBJECT ||
207          store_mode == STORE_AND_GROW_TRANSITION_TO_DOUBLE;
208 }
209
210
211 static inline KeyedAccessStoreMode GetNonTransitioningStoreMode(
212     KeyedAccessStoreMode store_mode) {
213   if (store_mode >= STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) {
214     return store_mode;
215   }
216   if (store_mode >= STORE_AND_GROW_NO_TRANSITION) {
217     return STORE_AND_GROW_NO_TRANSITION;
218   }
219   return STANDARD_STORE;
220 }
221
222
223 static inline bool IsGrowStoreMode(KeyedAccessStoreMode store_mode) {
224   return store_mode >= STORE_AND_GROW_NO_TRANSITION &&
225          store_mode <= STORE_AND_GROW_TRANSITION_TO_DOUBLE;
226 }
227
228
229 enum IcCheckType { ELEMENT, PROPERTY };
230
231
232 // SKIP_WRITE_BARRIER skips the write barrier.
233 // UPDATE_WEAK_WRITE_BARRIER skips the marking part of the write barrier and
234 // only performs the generational part.
235 // UPDATE_WRITE_BARRIER is doing the full barrier, marking and generational.
236 enum WriteBarrierMode {
237   SKIP_WRITE_BARRIER,
238   UPDATE_WEAK_WRITE_BARRIER,
239   UPDATE_WRITE_BARRIER
240 };
241
242
243 // Indicates whether a value can be loaded as a constant.
244 enum StoreMode { ALLOW_IN_DESCRIPTOR, FORCE_FIELD };
245
246
247 // PropertyNormalizationMode is used to specify whether to keep
248 // inobject properties when normalizing properties of a JSObject.
249 enum PropertyNormalizationMode {
250   CLEAR_INOBJECT_PROPERTIES,
251   KEEP_INOBJECT_PROPERTIES
252 };
253
254
255 // Indicates how aggressively the prototype should be optimized. FAST_PROTOTYPE
256 // will give the fastest result by tailoring the map to the prototype, but that
257 // will cause polymorphism with other objects. REGULAR_PROTOTYPE is to be used
258 // (at least for now) when dynamically modifying the prototype chain of an
259 // object using __proto__ or Object.setPrototypeOf.
260 enum PrototypeOptimizationMode { REGULAR_PROTOTYPE, FAST_PROTOTYPE };
261
262
263 // Indicates whether transitions can be added to a source map or not.
264 enum TransitionFlag {
265   INSERT_TRANSITION,
266   OMIT_TRANSITION
267 };
268
269
270 // Indicates whether the transition is simple: the target map of the transition
271 // either extends the current map with a new property, or it modifies the
272 // property that was added last to the current map.
273 enum SimpleTransitionFlag {
274   SIMPLE_PROPERTY_TRANSITION,
275   PROPERTY_TRANSITION,
276   SPECIAL_TRANSITION
277 };
278
279
280 // Indicates whether we are only interested in the descriptors of a particular
281 // map, or in all descriptors in the descriptor array.
282 enum DescriptorFlag {
283   ALL_DESCRIPTORS,
284   OWN_DESCRIPTORS
285 };
286
287 // The GC maintains a bit of information, the MarkingParity, which toggles
288 // from odd to even and back every time marking is completed. Incremental
289 // marking can visit an object twice during a marking phase, so algorithms that
290 // that piggy-back on marking can use the parity to ensure that they only
291 // perform an operation on an object once per marking phase: they record the
292 // MarkingParity when they visit an object, and only re-visit the object when it
293 // is marked again and the MarkingParity changes.
294 enum MarkingParity {
295   NO_MARKING_PARITY,
296   ODD_MARKING_PARITY,
297   EVEN_MARKING_PARITY
298 };
299
300 // ICs store extra state in a Code object. The default extra state is
301 // kNoExtraICState.
302 typedef int ExtraICState;
303 static const ExtraICState kNoExtraICState = 0;
304
305 // Instance size sentinel for objects of variable size.
306 const int kVariableSizeSentinel = 0;
307
308 // We may store the unsigned bit field as signed Smi value and do not
309 // use the sign bit.
310 const int kStubMajorKeyBits = 7;
311 const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1;
312
313 // All Maps have a field instance_type containing a InstanceType.
314 // It describes the type of the instances.
315 //
316 // As an example, a JavaScript object is a heap object and its map
317 // instance_type is JS_OBJECT_TYPE.
318 //
319 // The names of the string instance types are intended to systematically
320 // mirror their encoding in the instance_type field of the map.  The default
321 // encoding is considered TWO_BYTE.  It is not mentioned in the name.  ONE_BYTE
322 // encoding is mentioned explicitly in the name.  Likewise, the default
323 // representation is considered sequential.  It is not mentioned in the
324 // name.  The other representations (e.g. CONS, EXTERNAL) are explicitly
325 // mentioned.  Finally, the string is either a STRING_TYPE (if it is a normal
326 // string) or a INTERNALIZED_STRING_TYPE (if it is a internalized string).
327 //
328 // NOTE: The following things are some that depend on the string types having
329 // instance_types that are less than those of all other types:
330 // HeapObject::Size, HeapObject::IterateBody, the typeof operator, and
331 // Object::IsString.
332 //
333 // NOTE: Everything following JS_VALUE_TYPE is considered a
334 // JSObject for GC purposes. The first four entries here have typeof
335 // 'object', whereas JS_FUNCTION_TYPE has typeof 'function'.
336 #define INSTANCE_TYPE_LIST(V)                                   \
337   V(STRING_TYPE)                                                \
338   V(ONE_BYTE_STRING_TYPE)                                       \
339   V(CONS_STRING_TYPE)                                           \
340   V(CONS_ONE_BYTE_STRING_TYPE)                                  \
341   V(SLICED_STRING_TYPE)                                         \
342   V(SLICED_ONE_BYTE_STRING_TYPE)                                \
343   V(EXTERNAL_STRING_TYPE)                                       \
344   V(EXTERNAL_ONE_BYTE_STRING_TYPE)                              \
345   V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE)                    \
346   V(SHORT_EXTERNAL_STRING_TYPE)                                 \
347   V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE)                        \
348   V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE)              \
349                                                                 \
350   V(INTERNALIZED_STRING_TYPE)                                   \
351   V(ONE_BYTE_INTERNALIZED_STRING_TYPE)                          \
352   V(EXTERNAL_INTERNALIZED_STRING_TYPE)                          \
353   V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE)                 \
354   V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE)       \
355   V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE)                    \
356   V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE)           \
357   V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \
358                                                                 \
359   V(SYMBOL_TYPE)                                                \
360   V(SIMD128_VALUE_TYPE)                                         \
361                                                                 \
362   V(MAP_TYPE)                                                   \
363   V(CODE_TYPE)                                                  \
364   V(ODDBALL_TYPE)                                               \
365   V(CELL_TYPE)                                                  \
366   V(PROPERTY_CELL_TYPE)                                         \
367                                                                 \
368   V(HEAP_NUMBER_TYPE)                                           \
369   V(MUTABLE_HEAP_NUMBER_TYPE)                                   \
370   V(FOREIGN_TYPE)                                               \
371   V(BYTE_ARRAY_TYPE)                                            \
372   V(BYTECODE_ARRAY_TYPE)                                        \
373   V(FREE_SPACE_TYPE)                                            \
374                                                                 \
375   V(FIXED_INT8_ARRAY_TYPE)                                      \
376   V(FIXED_UINT8_ARRAY_TYPE)                                     \
377   V(FIXED_INT16_ARRAY_TYPE)                                     \
378   V(FIXED_UINT16_ARRAY_TYPE)                                    \
379   V(FIXED_INT32_ARRAY_TYPE)                                     \
380   V(FIXED_UINT32_ARRAY_TYPE)                                    \
381   V(FIXED_FLOAT32_ARRAY_TYPE)                                   \
382   V(FIXED_FLOAT64_ARRAY_TYPE)                                   \
383   V(FIXED_UINT8_CLAMPED_ARRAY_TYPE)                             \
384                                                                 \
385   V(FILLER_TYPE)                                                \
386                                                                 \
387   V(DECLARED_ACCESSOR_DESCRIPTOR_TYPE)                          \
388   V(DECLARED_ACCESSOR_INFO_TYPE)                                \
389   V(EXECUTABLE_ACCESSOR_INFO_TYPE)                              \
390   V(ACCESSOR_PAIR_TYPE)                                         \
391   V(ACCESS_CHECK_INFO_TYPE)                                     \
392   V(INTERCEPTOR_INFO_TYPE)                                      \
393   V(CALL_HANDLER_INFO_TYPE)                                     \
394   V(FUNCTION_TEMPLATE_INFO_TYPE)                                \
395   V(OBJECT_TEMPLATE_INFO_TYPE)                                  \
396   V(SIGNATURE_INFO_TYPE)                                        \
397   V(TYPE_SWITCH_INFO_TYPE)                                      \
398   V(ALLOCATION_MEMENTO_TYPE)                                    \
399   V(ALLOCATION_SITE_TYPE)                                       \
400   V(SCRIPT_TYPE)                                                \
401   V(CODE_CACHE_TYPE)                                            \
402   V(POLYMORPHIC_CODE_CACHE_TYPE)                                \
403   V(TYPE_FEEDBACK_INFO_TYPE)                                    \
404   V(ALIASED_ARGUMENTS_ENTRY_TYPE)                               \
405   V(BOX_TYPE)                                                   \
406   V(PROTOTYPE_INFO_TYPE)                                        \
407   V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION_TYPE)              \
408                                                                 \
409   V(FIXED_ARRAY_TYPE)                                           \
410   V(FIXED_DOUBLE_ARRAY_TYPE)                                    \
411   V(SHARED_FUNCTION_INFO_TYPE)                                  \
412   V(WEAK_CELL_TYPE)                                             \
413                                                                 \
414   V(JS_MESSAGE_OBJECT_TYPE)                                     \
415                                                                 \
416   V(JS_VALUE_TYPE)                                              \
417   V(JS_DATE_TYPE)                                               \
418   V(JS_OBJECT_TYPE)                                             \
419   V(JS_CONTEXT_EXTENSION_OBJECT_TYPE)                           \
420   V(JS_GENERATOR_OBJECT_TYPE)                                   \
421   V(JS_MODULE_TYPE)                                             \
422   V(JS_GLOBAL_OBJECT_TYPE)                                      \
423   V(JS_BUILTINS_OBJECT_TYPE)                                    \
424   V(JS_GLOBAL_PROXY_TYPE)                                       \
425   V(JS_ARRAY_TYPE)                                              \
426   V(JS_ARRAY_BUFFER_TYPE)                                       \
427   V(JS_TYPED_ARRAY_TYPE)                                        \
428   V(JS_DATA_VIEW_TYPE)                                          \
429   V(JS_PROXY_TYPE)                                              \
430   V(JS_SET_TYPE)                                                \
431   V(JS_MAP_TYPE)                                                \
432   V(JS_SET_ITERATOR_TYPE)                                       \
433   V(JS_MAP_ITERATOR_TYPE)                                       \
434   V(JS_ITERATOR_RESULT_TYPE)                                    \
435   V(JS_WEAK_MAP_TYPE)                                           \
436   V(JS_WEAK_SET_TYPE)                                           \
437   V(JS_REGEXP_TYPE)                                             \
438                                                                 \
439   V(JS_FUNCTION_TYPE)                                           \
440   V(JS_FUNCTION_PROXY_TYPE)                                     \
441   V(DEBUG_INFO_TYPE)                                            \
442   V(BREAK_POINT_INFO_TYPE)
443
444
445 // Since string types are not consecutive, this macro is used to
446 // iterate over them.
447 #define STRING_TYPE_LIST(V)                                                   \
448   V(STRING_TYPE, kVariableSizeSentinel, string, String)                       \
449   V(ONE_BYTE_STRING_TYPE, kVariableSizeSentinel, one_byte_string,             \
450     OneByteString)                                                            \
451   V(CONS_STRING_TYPE, ConsString::kSize, cons_string, ConsString)             \
452   V(CONS_ONE_BYTE_STRING_TYPE, ConsString::kSize, cons_one_byte_string,       \
453     ConsOneByteString)                                                        \
454   V(SLICED_STRING_TYPE, SlicedString::kSize, sliced_string, SlicedString)     \
455   V(SLICED_ONE_BYTE_STRING_TYPE, SlicedString::kSize, sliced_one_byte_string, \
456     SlicedOneByteString)                                                      \
457   V(EXTERNAL_STRING_TYPE, ExternalTwoByteString::kSize, external_string,      \
458     ExternalString)                                                           \
459   V(EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kSize,              \
460     external_one_byte_string, ExternalOneByteString)                          \
461   V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE, ExternalTwoByteString::kSize,    \
462     external_string_with_one_byte_data, ExternalStringWithOneByteData)        \
463   V(SHORT_EXTERNAL_STRING_TYPE, ExternalTwoByteString::kShortSize,            \
464     short_external_string, ShortExternalString)                               \
465   V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kShortSize,   \
466     short_external_one_byte_string, ShortExternalOneByteString)               \
467   V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE,                            \
468     ExternalTwoByteString::kShortSize,                                        \
469     short_external_string_with_one_byte_data,                                 \
470     ShortExternalStringWithOneByteData)                                       \
471                                                                               \
472   V(INTERNALIZED_STRING_TYPE, kVariableSizeSentinel, internalized_string,     \
473     InternalizedString)                                                       \
474   V(ONE_BYTE_INTERNALIZED_STRING_TYPE, kVariableSizeSentinel,                 \
475     one_byte_internalized_string, OneByteInternalizedString)                  \
476   V(EXTERNAL_INTERNALIZED_STRING_TYPE, ExternalTwoByteString::kSize,          \
477     external_internalized_string, ExternalInternalizedString)                 \
478   V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, ExternalOneByteString::kSize, \
479     external_one_byte_internalized_string, ExternalOneByteInternalizedString) \
480   V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE,                     \
481     ExternalTwoByteString::kSize,                                             \
482     external_internalized_string_with_one_byte_data,                          \
483     ExternalInternalizedStringWithOneByteData)                                \
484   V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE,                                  \
485     ExternalTwoByteString::kShortSize, short_external_internalized_string,    \
486     ShortExternalInternalizedString)                                          \
487   V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE,                         \
488     ExternalOneByteString::kShortSize,                                        \
489     short_external_one_byte_internalized_string,                              \
490     ShortExternalOneByteInternalizedString)                                   \
491   V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE,               \
492     ExternalTwoByteString::kShortSize,                                        \
493     short_external_internalized_string_with_one_byte_data,                    \
494     ShortExternalInternalizedStringWithOneByteData)
495
496 // A struct is a simple object a set of object-valued fields.  Including an
497 // object type in this causes the compiler to generate most of the boilerplate
498 // code for the class including allocation and garbage collection routines,
499 // casts and predicates.  All you need to define is the class, methods and
500 // object verification routines.  Easy, no?
501 //
502 // Note that for subtle reasons related to the ordering or numerical values of
503 // type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST
504 // manually.
505 #define STRUCT_LIST(V)                                                       \
506   V(BOX, Box, box)                                                           \
507   V(EXECUTABLE_ACCESSOR_INFO, ExecutableAccessorInfo,                        \
508     executable_accessor_info)                                                \
509   V(ACCESSOR_PAIR, AccessorPair, accessor_pair)                              \
510   V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info)                   \
511   V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info)                     \
512   V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info)                   \
513   V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info)    \
514   V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info)          \
515   V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info)                      \
516   V(SCRIPT, Script, script)                                                  \
517   V(ALLOCATION_SITE, AllocationSite, allocation_site)                        \
518   V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento)               \
519   V(CODE_CACHE, CodeCache, code_cache)                                       \
520   V(POLYMORPHIC_CODE_CACHE, PolymorphicCodeCache, polymorphic_code_cache)    \
521   V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info)                \
522   V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \
523   V(DEBUG_INFO, DebugInfo, debug_info)                                       \
524   V(BREAK_POINT_INFO, BreakPointInfo, break_point_info)                      \
525   V(PROTOTYPE_INFO, PrototypeInfo, prototype_info)                           \
526   V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION,                                \
527     SloppyBlockWithEvalContextExtension,                                     \
528     sloppy_block_with_eval_context_extension)
529
530 // We use the full 8 bits of the instance_type field to encode heap object
531 // instance types.  The high-order bit (bit 7) is set if the object is not a
532 // string, and cleared if it is a string.
533 const uint32_t kIsNotStringMask = 0x80;
534 const uint32_t kStringTag = 0x0;
535 const uint32_t kNotStringTag = 0x80;
536
537 // Bit 6 indicates that the object is an internalized string (if set) or not.
538 // Bit 7 has to be clear as well.
539 const uint32_t kIsNotInternalizedMask = 0x40;
540 const uint32_t kNotInternalizedTag = 0x40;
541 const uint32_t kInternalizedTag = 0x0;
542
543 // If bit 7 is clear then bit 2 indicates whether the string consists of
544 // two-byte characters or one-byte characters.
545 const uint32_t kStringEncodingMask = 0x4;
546 const uint32_t kTwoByteStringTag = 0x0;
547 const uint32_t kOneByteStringTag = 0x4;
548
549 // If bit 7 is clear, the low-order 2 bits indicate the representation
550 // of the string.
551 const uint32_t kStringRepresentationMask = 0x03;
552 enum StringRepresentationTag {
553   kSeqStringTag = 0x0,
554   kConsStringTag = 0x1,
555   kExternalStringTag = 0x2,
556   kSlicedStringTag = 0x3
557 };
558 const uint32_t kIsIndirectStringMask = 0x1;
559 const uint32_t kIsIndirectStringTag = 0x1;
560 STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0);  // NOLINT
561 STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0);  // NOLINT
562 STATIC_ASSERT((kConsStringTag &
563                kIsIndirectStringMask) == kIsIndirectStringTag);  // NOLINT
564 STATIC_ASSERT((kSlicedStringTag &
565                kIsIndirectStringMask) == kIsIndirectStringTag);  // NOLINT
566
567 // Use this mask to distinguish between cons and slice only after making
568 // sure that the string is one of the two (an indirect string).
569 const uint32_t kSlicedNotConsMask = kSlicedStringTag & ~kConsStringTag;
570 STATIC_ASSERT(IS_POWER_OF_TWO(kSlicedNotConsMask));
571
572 // If bit 7 is clear, then bit 3 indicates whether this two-byte
573 // string actually contains one byte data.
574 const uint32_t kOneByteDataHintMask = 0x08;
575 const uint32_t kOneByteDataHintTag = 0x08;
576
577 // If bit 7 is clear and string representation indicates an external string,
578 // then bit 4 indicates whether the data pointer is cached.
579 const uint32_t kShortExternalStringMask = 0x10;
580 const uint32_t kShortExternalStringTag = 0x10;
581
582
583 // A ConsString with an empty string as the right side is a candidate
584 // for being shortcut by the garbage collector. We don't allocate any
585 // non-flat internalized strings, so we do not shortcut them thereby
586 // avoiding turning internalized strings into strings. The bit-masks
587 // below contain the internalized bit as additional safety.
588 // See heap.cc, mark-compact.cc and objects-visiting.cc.
589 const uint32_t kShortcutTypeMask =
590     kIsNotStringMask |
591     kIsNotInternalizedMask |
592     kStringRepresentationMask;
593 const uint32_t kShortcutTypeTag = kConsStringTag | kNotInternalizedTag;
594
595 static inline bool IsShortcutCandidate(int type) {
596   return ((type & kShortcutTypeMask) == kShortcutTypeTag);
597 }
598
599
600 enum InstanceType {
601   // String types.
602   INTERNALIZED_STRING_TYPE = kTwoByteStringTag | kSeqStringTag |
603                              kInternalizedTag,  // FIRST_PRIMITIVE_TYPE
604   ONE_BYTE_INTERNALIZED_STRING_TYPE =
605       kOneByteStringTag | kSeqStringTag | kInternalizedTag,
606   EXTERNAL_INTERNALIZED_STRING_TYPE =
607       kTwoByteStringTag | kExternalStringTag | kInternalizedTag,
608   EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE =
609       kOneByteStringTag | kExternalStringTag | kInternalizedTag,
610   EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE =
611       EXTERNAL_INTERNALIZED_STRING_TYPE | kOneByteDataHintTag |
612       kInternalizedTag,
613   SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE = EXTERNAL_INTERNALIZED_STRING_TYPE |
614                                             kShortExternalStringTag |
615                                             kInternalizedTag,
616   SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE =
617       EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kShortExternalStringTag |
618       kInternalizedTag,
619   SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE =
620       EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
621       kShortExternalStringTag | kInternalizedTag,
622   STRING_TYPE = INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
623   ONE_BYTE_STRING_TYPE =
624       ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
625   CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag | kNotInternalizedTag,
626   CONS_ONE_BYTE_STRING_TYPE =
627       kOneByteStringTag | kConsStringTag | kNotInternalizedTag,
628   SLICED_STRING_TYPE =
629       kTwoByteStringTag | kSlicedStringTag | kNotInternalizedTag,
630   SLICED_ONE_BYTE_STRING_TYPE =
631       kOneByteStringTag | kSlicedStringTag | kNotInternalizedTag,
632   EXTERNAL_STRING_TYPE =
633       EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
634   EXTERNAL_ONE_BYTE_STRING_TYPE =
635       EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
636   EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE =
637       EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
638       kNotInternalizedTag,
639   SHORT_EXTERNAL_STRING_TYPE =
640       SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
641   SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE =
642       SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
643   SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE =
644       SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
645       kNotInternalizedTag,
646
647   // Non-string names
648   SYMBOL_TYPE = kNotStringTag,  // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE
649
650   // Other primitives (cannot contain non-map-word pointers to heap objects).
651   HEAP_NUMBER_TYPE,
652   SIMD128_VALUE_TYPE,
653   ODDBALL_TYPE,  // LAST_PRIMITIVE_TYPE
654
655   // Objects allocated in their own spaces (never in new space).
656   MAP_TYPE,
657   CODE_TYPE,
658
659   // "Data", objects that cannot contain non-map-word pointers to heap
660   // objects.
661   MUTABLE_HEAP_NUMBER_TYPE,
662   FOREIGN_TYPE,
663   BYTE_ARRAY_TYPE,
664   BYTECODE_ARRAY_TYPE,
665   FREE_SPACE_TYPE,
666   FIXED_INT8_ARRAY_TYPE,  // FIRST_FIXED_TYPED_ARRAY_TYPE
667   FIXED_UINT8_ARRAY_TYPE,
668   FIXED_INT16_ARRAY_TYPE,
669   FIXED_UINT16_ARRAY_TYPE,
670   FIXED_INT32_ARRAY_TYPE,
671   FIXED_UINT32_ARRAY_TYPE,
672   FIXED_FLOAT32_ARRAY_TYPE,
673   FIXED_FLOAT64_ARRAY_TYPE,
674   FIXED_UINT8_CLAMPED_ARRAY_TYPE,  // LAST_FIXED_TYPED_ARRAY_TYPE
675   FIXED_DOUBLE_ARRAY_TYPE,
676   FILLER_TYPE,  // LAST_DATA_TYPE
677
678   // Structs.
679   DECLARED_ACCESSOR_DESCRIPTOR_TYPE,
680   DECLARED_ACCESSOR_INFO_TYPE,
681   EXECUTABLE_ACCESSOR_INFO_TYPE,
682   ACCESSOR_PAIR_TYPE,
683   ACCESS_CHECK_INFO_TYPE,
684   INTERCEPTOR_INFO_TYPE,
685   CALL_HANDLER_INFO_TYPE,
686   FUNCTION_TEMPLATE_INFO_TYPE,
687   OBJECT_TEMPLATE_INFO_TYPE,
688   SIGNATURE_INFO_TYPE,
689   TYPE_SWITCH_INFO_TYPE,
690   ALLOCATION_SITE_TYPE,
691   ALLOCATION_MEMENTO_TYPE,
692   SCRIPT_TYPE,
693   CODE_CACHE_TYPE,
694   POLYMORPHIC_CODE_CACHE_TYPE,
695   TYPE_FEEDBACK_INFO_TYPE,
696   ALIASED_ARGUMENTS_ENTRY_TYPE,
697   BOX_TYPE,
698   DEBUG_INFO_TYPE,
699   BREAK_POINT_INFO_TYPE,
700   FIXED_ARRAY_TYPE,
701   SHARED_FUNCTION_INFO_TYPE,
702   CELL_TYPE,
703   WEAK_CELL_TYPE,
704   PROPERTY_CELL_TYPE,
705   PROTOTYPE_INFO_TYPE,
706   SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION_TYPE,
707
708   // All the following types are subtypes of JSReceiver, which corresponds to
709   // objects in the JS sense. The first and the last type in this range are
710   // the two forms of function. This organization enables using the same
711   // compares for checking the JS_RECEIVER/SPEC_OBJECT range and the
712   // NONCALLABLE_JS_OBJECT range.
713   JS_FUNCTION_PROXY_TYPE,  // FIRST_JS_RECEIVER_TYPE, FIRST_JS_PROXY_TYPE
714   JS_PROXY_TYPE,           // LAST_JS_PROXY_TYPE
715   JS_VALUE_TYPE,           // FIRST_JS_OBJECT_TYPE
716   JS_MESSAGE_OBJECT_TYPE,
717   JS_DATE_TYPE,
718   JS_OBJECT_TYPE,
719   JS_CONTEXT_EXTENSION_OBJECT_TYPE,
720   JS_GENERATOR_OBJECT_TYPE,
721   JS_MODULE_TYPE,
722   JS_GLOBAL_OBJECT_TYPE,
723   JS_BUILTINS_OBJECT_TYPE,
724   JS_GLOBAL_PROXY_TYPE,
725   JS_ARRAY_TYPE,
726   JS_ARRAY_BUFFER_TYPE,
727   JS_TYPED_ARRAY_TYPE,
728   JS_DATA_VIEW_TYPE,
729   JS_SET_TYPE,
730   JS_MAP_TYPE,
731   JS_SET_ITERATOR_TYPE,
732   JS_MAP_ITERATOR_TYPE,
733   JS_ITERATOR_RESULT_TYPE,
734   JS_WEAK_MAP_TYPE,
735   JS_WEAK_SET_TYPE,
736   JS_REGEXP_TYPE,
737   JS_FUNCTION_TYPE,  // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE
738
739   // Pseudo-types
740   FIRST_TYPE = 0x0,
741   LAST_TYPE = JS_FUNCTION_TYPE,
742   FIRST_NAME_TYPE = FIRST_TYPE,
743   LAST_NAME_TYPE = SYMBOL_TYPE,
744   FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE,
745   LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE,
746   FIRST_NONSTRING_TYPE = SYMBOL_TYPE,
747   FIRST_PRIMITIVE_TYPE = FIRST_NAME_TYPE,
748   LAST_PRIMITIVE_TYPE = ODDBALL_TYPE,
749   // Boundaries for testing for a fixed typed array.
750   FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE,
751   LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_UINT8_CLAMPED_ARRAY_TYPE,
752   // Boundary for promotion to old space.
753   LAST_DATA_TYPE = FILLER_TYPE,
754   // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy).
755   // Note that there is no range for JSObject or JSProxy, since their subtypes
756   // are not continuous in this enum! The enum ranges instead reflect the
757   // external class names, where proxies are treated as either ordinary objects,
758   // or functions.
759   FIRST_JS_RECEIVER_TYPE = JS_FUNCTION_PROXY_TYPE,
760   LAST_JS_RECEIVER_TYPE = LAST_TYPE,
761   // Boundaries for testing the types represented as JSObject
762   FIRST_JS_OBJECT_TYPE = JS_VALUE_TYPE,
763   LAST_JS_OBJECT_TYPE = LAST_TYPE,
764   // Boundaries for testing the types represented as JSProxy
765   FIRST_JS_PROXY_TYPE = JS_FUNCTION_PROXY_TYPE,
766   LAST_JS_PROXY_TYPE = JS_PROXY_TYPE,
767   // Boundaries for testing whether the type is a JavaScript object.
768   FIRST_SPEC_OBJECT_TYPE = FIRST_JS_RECEIVER_TYPE,
769   LAST_SPEC_OBJECT_TYPE = LAST_JS_RECEIVER_TYPE,
770   // Boundaries for testing the types for which typeof is "object".
771   FIRST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_PROXY_TYPE,
772   LAST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_REGEXP_TYPE,
773   // Note that the types for which typeof is "function" are not continuous.
774   // Define this so that we can put assertions on discrete checks.
775   NUM_OF_CALLABLE_SPEC_OBJECT_TYPES = 2
776 };
777
778 STATIC_ASSERT(JS_OBJECT_TYPE == Internals::kJSObjectType);
779 STATIC_ASSERT(FIRST_NONSTRING_TYPE == Internals::kFirstNonstringType);
780 STATIC_ASSERT(ODDBALL_TYPE == Internals::kOddballType);
781 STATIC_ASSERT(FOREIGN_TYPE == Internals::kForeignType);
782
783
784 #define FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(V) \
785   V(FAST_ELEMENTS_SUB_TYPE)                   \
786   V(DICTIONARY_ELEMENTS_SUB_TYPE)             \
787   V(FAST_PROPERTIES_SUB_TYPE)                 \
788   V(DICTIONARY_PROPERTIES_SUB_TYPE)           \
789   V(MAP_CODE_CACHE_SUB_TYPE)                  \
790   V(SCOPE_INFO_SUB_TYPE)                      \
791   V(STRING_TABLE_SUB_TYPE)                    \
792   V(DESCRIPTOR_ARRAY_SUB_TYPE)                \
793   V(TRANSITION_ARRAY_SUB_TYPE)
794
795 enum FixedArraySubInstanceType {
796 #define DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE(name) name,
797   FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE)
798 #undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE
799   LAST_FIXED_ARRAY_SUB_TYPE = TRANSITION_ARRAY_SUB_TYPE
800 };
801
802
803 enum CompareResult {
804   LESS      = -1,
805   EQUAL     =  0,
806   GREATER   =  1,
807
808   NOT_EQUAL = GREATER
809 };
810
811
812 #define DECL_BOOLEAN_ACCESSORS(name)   \
813   inline bool name() const;            \
814   inline void set_##name(bool value);  \
815
816
817 #define DECL_ACCESSORS(name, type)                                      \
818   inline type* name() const;                                            \
819   inline void set_##name(type* value,                                   \
820                          WriteBarrierMode mode = UPDATE_WRITE_BARRIER); \
821
822
823 #define DECLARE_CAST(type)                              \
824   INLINE(static type* cast(Object* object));            \
825   INLINE(static const type* cast(const Object* object));
826
827
828 class AccessorPair;
829 class AllocationSite;
830 class AllocationSiteCreationContext;
831 class AllocationSiteUsageContext;
832 class Cell;
833 class ConsString;
834 class ElementsAccessor;
835 class FixedArrayBase;
836 class FunctionLiteral;
837 class GlobalObject;
838 class JSBuiltinsObject;
839 class LayoutDescriptor;
840 class LookupIterator;
841 class ObjectHashTable;
842 class ObjectVisitor;
843 class PropertyCell;
844 class SafepointEntry;
845 class SharedFunctionInfo;
846 class StringStream;
847 class TypeFeedbackInfo;
848 class TypeFeedbackVector;
849 class WeakCell;
850
851 // We cannot just say "class HeapType;" if it is created from a template... =8-?
852 template<class> class TypeImpl;
853 struct HeapTypeConfig;
854 typedef TypeImpl<HeapTypeConfig> HeapType;
855
856
857 // A template-ized version of the IsXXX functions.
858 template <class C> inline bool Is(Object* obj);
859
860 #ifdef VERIFY_HEAP
861 #define DECLARE_VERIFIER(Name) void Name##Verify();
862 #else
863 #define DECLARE_VERIFIER(Name)
864 #endif
865
866 #ifdef OBJECT_PRINT
867 #define DECLARE_PRINTER(Name) void Name##Print(std::ostream& os);  // NOLINT
868 #else
869 #define DECLARE_PRINTER(Name)
870 #endif
871
872
873 #define OBJECT_TYPE_LIST(V) \
874   V(Smi)                    \
875   V(HeapObject)             \
876   V(Number)
877
878 #define HEAP_OBJECT_TYPE_LIST(V)   \
879   V(HeapNumber)                    \
880   V(MutableHeapNumber)             \
881   V(Simd128Value)                  \
882   V(Float32x4)                     \
883   V(Int32x4)                       \
884   V(Uint32x4)                      \
885   V(Bool32x4)                      \
886   V(Int16x8)                       \
887   V(Uint16x8)                      \
888   V(Bool16x8)                      \
889   V(Int8x16)                       \
890   V(Uint8x16)                      \
891   V(Bool8x16)                      \
892   V(Name)                          \
893   V(UniqueName)                    \
894   V(String)                        \
895   V(SeqString)                     \
896   V(ExternalString)                \
897   V(ConsString)                    \
898   V(SlicedString)                  \
899   V(ExternalTwoByteString)         \
900   V(ExternalOneByteString)         \
901   V(SeqTwoByteString)              \
902   V(SeqOneByteString)              \
903   V(InternalizedString)            \
904   V(Symbol)                        \
905                                    \
906   V(FixedTypedArrayBase)           \
907   V(FixedUint8Array)               \
908   V(FixedInt8Array)                \
909   V(FixedUint16Array)              \
910   V(FixedInt16Array)               \
911   V(FixedUint32Array)              \
912   V(FixedInt32Array)               \
913   V(FixedFloat32Array)             \
914   V(FixedFloat64Array)             \
915   V(FixedUint8ClampedArray)        \
916   V(ByteArray)                     \
917   V(BytecodeArray)                 \
918   V(FreeSpace)                     \
919   V(JSReceiver)                    \
920   V(JSObject)                      \
921   V(JSContextExtensionObject)      \
922   V(JSGeneratorObject)             \
923   V(JSModule)                      \
924   V(LayoutDescriptor)              \
925   V(Map)                           \
926   V(DescriptorArray)               \
927   V(TransitionArray)               \
928   V(TypeFeedbackVector)            \
929   V(DeoptimizationInputData)       \
930   V(DeoptimizationOutputData)      \
931   V(DependentCode)                 \
932   V(HandlerTable)                  \
933   V(FixedArray)                    \
934   V(FixedDoubleArray)              \
935   V(WeakFixedArray)                \
936   V(ArrayList)                     \
937   V(Context)                       \
938   V(ScriptContextTable)            \
939   V(NativeContext)                 \
940   V(ScopeInfo)                     \
941   V(JSFunction)                    \
942   V(Code)                          \
943   V(Oddball)                       \
944   V(SharedFunctionInfo)            \
945   V(JSValue)                       \
946   V(JSDate)                        \
947   V(JSMessageObject)               \
948   V(StringWrapper)                 \
949   V(Foreign)                       \
950   V(Boolean)                       \
951   V(JSArray)                       \
952   V(JSArrayBuffer)                 \
953   V(JSArrayBufferView)             \
954   V(JSTypedArray)                  \
955   V(JSDataView)                    \
956   V(JSProxy)                       \
957   V(JSFunctionProxy)               \
958   V(JSSet)                         \
959   V(JSMap)                         \
960   V(JSSetIterator)                 \
961   V(JSMapIterator)                 \
962   V(JSIteratorResult)              \
963   V(JSWeakCollection)              \
964   V(JSWeakMap)                     \
965   V(JSWeakSet)                     \
966   V(JSRegExp)                      \
967   V(HashTable)                     \
968   V(Dictionary)                    \
969   V(StringTable)                   \
970   V(NormalizedMapCache)            \
971   V(CompilationCacheTable)         \
972   V(CodeCacheHashTable)            \
973   V(PolymorphicCodeCacheHashTable) \
974   V(MapCache)                      \
975   V(Primitive)                     \
976   V(GlobalObject)                  \
977   V(JSGlobalObject)                \
978   V(JSBuiltinsObject)              \
979   V(JSGlobalProxy)                 \
980   V(UndetectableObject)            \
981   V(AccessCheckNeeded)             \
982   V(Cell)                          \
983   V(PropertyCell)                  \
984   V(WeakCell)                      \
985   V(ObjectHashTable)               \
986   V(WeakHashTable)                 \
987   V(OrderedHashTable)
988
989 // Object is the abstract superclass for all classes in the
990 // object hierarchy.
991 // Object does not use any virtual functions to avoid the
992 // allocation of the C++ vtable.
993 // Since both Smi and HeapObject are subclasses of Object no
994 // data members can be present in Object.
995 class Object {
996  public:
997   // Type testing.
998   bool IsObject() const { return true; }
999
1000 #define IS_TYPE_FUNCTION_DECL(type_)  INLINE(bool Is##type_() const);
1001   OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL)
1002   HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL)
1003 #undef IS_TYPE_FUNCTION_DECL
1004
1005   // A non-keyed store is of the form a.x = foo or a["x"] = foo whereas
1006   // a keyed store is of the form a[expression] = foo.
1007   enum StoreFromKeyed {
1008     MAY_BE_STORE_FROM_KEYED,
1009     CERTAINLY_NOT_STORE_FROM_KEYED
1010   };
1011
1012   INLINE(bool IsFixedArrayBase() const);
1013   INLINE(bool IsExternal() const);
1014   INLINE(bool IsAccessorInfo() const);
1015
1016   INLINE(bool IsStruct() const);
1017 #define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \
1018   INLINE(bool Is##Name() const);
1019   STRUCT_LIST(DECLARE_STRUCT_PREDICATE)
1020 #undef DECLARE_STRUCT_PREDICATE
1021
1022   // ES6, section 7.2.3 IsCallable.
1023   INLINE(bool IsCallable() const);
1024
1025   INLINE(bool IsSpecObject()) const;
1026   // TODO(rossberg): IsSpecFunction should be removed in favor of IsCallable.
1027   INLINE(bool IsSpecFunction()) const;
1028   INLINE(bool IsTemplateInfo()) const;
1029   INLINE(bool IsNameDictionary() const);
1030   INLINE(bool IsGlobalDictionary() const);
1031   INLINE(bool IsSeededNumberDictionary() const);
1032   INLINE(bool IsUnseededNumberDictionary() const);
1033   INLINE(bool IsOrderedHashSet() const);
1034   INLINE(bool IsOrderedHashMap() const);
1035   static bool IsPromise(Handle<Object> object);
1036
1037   // Oddball testing.
1038   INLINE(bool IsUndefined() const);
1039   INLINE(bool IsNull() const);
1040   INLINE(bool IsTheHole() const);
1041   INLINE(bool IsException() const);
1042   INLINE(bool IsUninitialized() const);
1043   INLINE(bool IsTrue() const);
1044   INLINE(bool IsFalse() const);
1045   INLINE(bool IsArgumentsMarker() const);
1046
1047   // Filler objects (fillers and free space objects).
1048   INLINE(bool IsFiller() const);
1049
1050   // Extract the number.
1051   inline double Number();
1052   INLINE(bool IsNaN() const);
1053   INLINE(bool IsMinusZero() const);
1054   bool ToInt32(int32_t* value);
1055   bool ToUint32(uint32_t* value);
1056
1057   inline Representation OptimalRepresentation();
1058
1059   inline ElementsKind OptimalElementsKind();
1060
1061   inline bool FitsRepresentation(Representation representation);
1062
1063   // Checks whether two valid primitive encodings of a property name resolve to
1064   // the same logical property. E.g., the smi 1, the string "1" and the double
1065   // 1 all refer to the same property, so this helper will return true.
1066   inline bool KeyEquals(Object* other);
1067
1068   Handle<HeapType> OptimalType(Isolate* isolate, Representation representation);
1069
1070   inline static Handle<Object> NewStorageFor(Isolate* isolate,
1071                                              Handle<Object> object,
1072                                              Representation representation);
1073
1074   inline static Handle<Object> WrapForRead(Isolate* isolate,
1075                                            Handle<Object> object,
1076                                            Representation representation);
1077
1078   // Returns true if the object is of the correct type to be used as a
1079   // implementation of a JSObject's elements.
1080   inline bool HasValidElements();
1081
1082   inline bool HasSpecificClassOf(String* name);
1083
1084   bool BooleanValue();                                      // ECMA-262 9.2.
1085
1086   // ES6 section 7.2.13 Strict Equality Comparison
1087   bool StrictEquals(Object* that);
1088
1089   // Convert to a JSObject if needed.
1090   // native_context is used when creating wrapper object.
1091   static inline MaybeHandle<JSReceiver> ToObject(Isolate* isolate,
1092                                                  Handle<Object> object);
1093   MUST_USE_RESULT static MaybeHandle<JSReceiver> ToObject(
1094       Isolate* isolate, Handle<Object> object, Handle<Context> context);
1095
1096   // ES6 section 7.1.14 ToPropertyKey
1097   MUST_USE_RESULT static inline MaybeHandle<Name> ToName(Isolate* isolate,
1098                                                          Handle<Object> input);
1099
1100   // ES6 section 7.1.1 ToPrimitive
1101   MUST_USE_RESULT static inline MaybeHandle<Object> ToPrimitive(
1102       Handle<Object> input, ToPrimitiveHint hint = ToPrimitiveHint::kDefault);
1103
1104   // ES6 section 7.1.3 ToNumber
1105   MUST_USE_RESULT static MaybeHandle<Object> ToNumber(Isolate* isolate,
1106                                                       Handle<Object> input);
1107
1108   // ES6 section 7.1.12 ToString
1109   MUST_USE_RESULT static MaybeHandle<String> ToString(Isolate* isolate,
1110                                                       Handle<Object> input);
1111
1112   // ES6 section 7.3.9 GetMethod
1113   MUST_USE_RESULT static MaybeHandle<Object> GetMethod(
1114       Handle<JSReceiver> receiver, Handle<Name> name);
1115
1116   // ES6 section 12.5.6 The typeof Operator
1117   static Handle<String> TypeOf(Isolate* isolate, Handle<Object> object);
1118
1119   MUST_USE_RESULT static MaybeHandle<Object> GetProperty(
1120       LookupIterator* it, LanguageMode language_mode = SLOPPY);
1121
1122   // Implementation of [[Put]], ECMA-262 5th edition, section 8.12.5.
1123   MUST_USE_RESULT static MaybeHandle<Object> SetProperty(
1124       Handle<Object> object, Handle<Name> name, Handle<Object> value,
1125       LanguageMode language_mode,
1126       StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED);
1127
1128   MUST_USE_RESULT static MaybeHandle<Object> SetProperty(
1129       LookupIterator* it, Handle<Object> value, LanguageMode language_mode,
1130       StoreFromKeyed store_mode);
1131
1132   MUST_USE_RESULT static MaybeHandle<Object> SetSuperProperty(
1133       LookupIterator* it, Handle<Object> value, LanguageMode language_mode,
1134       StoreFromKeyed store_mode);
1135
1136   MUST_USE_RESULT static MaybeHandle<Object> ReadAbsentProperty(
1137       LookupIterator* it, LanguageMode language_mode);
1138   MUST_USE_RESULT static MaybeHandle<Object> ReadAbsentProperty(
1139       Isolate* isolate, Handle<Object> receiver, Handle<Object> name,
1140       LanguageMode language_mode);
1141   MUST_USE_RESULT static MaybeHandle<Object> WriteToReadOnlyProperty(
1142       LookupIterator* it, Handle<Object> value, LanguageMode language_mode);
1143   MUST_USE_RESULT static MaybeHandle<Object> WriteToReadOnlyProperty(
1144       Isolate* isolate, Handle<Object> receiver, Handle<Object> name,
1145       Handle<Object> value, LanguageMode language_mode);
1146   MUST_USE_RESULT static MaybeHandle<Object> RedefineNonconfigurableProperty(
1147       Isolate* isolate, Handle<Object> name, Handle<Object> value,
1148       LanguageMode language_mode);
1149   MUST_USE_RESULT static MaybeHandle<Object> SetDataProperty(
1150       LookupIterator* it, Handle<Object> value);
1151   MUST_USE_RESULT static MaybeHandle<Object> AddDataProperty(
1152       LookupIterator* it, Handle<Object> value, PropertyAttributes attributes,
1153       LanguageMode language_mode, StoreFromKeyed store_mode);
1154   MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement(
1155       Handle<Object> object, Handle<Name> name,
1156       LanguageMode language_mode = SLOPPY);
1157   MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty(
1158       Isolate* isolate, Handle<Object> object, const char* key,
1159       LanguageMode language_mode = SLOPPY);
1160   MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty(
1161       Handle<Object> object, Handle<Name> name,
1162       LanguageMode language_mode = SLOPPY);
1163
1164   MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithAccessor(
1165       LookupIterator* it, LanguageMode language_mode);
1166   MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithAccessor(
1167       LookupIterator* it, Handle<Object> value, LanguageMode language_mode);
1168
1169   MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithDefinedGetter(
1170       Handle<Object> receiver,
1171       Handle<JSReceiver> getter);
1172   MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithDefinedSetter(
1173       Handle<Object> receiver,
1174       Handle<JSReceiver> setter,
1175       Handle<Object> value);
1176
1177   MUST_USE_RESULT static inline MaybeHandle<Object> GetElement(
1178       Isolate* isolate, Handle<Object> object, uint32_t index,
1179       LanguageMode language_mode = SLOPPY);
1180
1181   MUST_USE_RESULT static inline MaybeHandle<Object> SetElement(
1182       Isolate* isolate, Handle<Object> object, uint32_t index,
1183       Handle<Object> value, LanguageMode language_mode);
1184
1185   static inline Handle<Object> GetPrototypeSkipHiddenPrototypes(
1186       Isolate* isolate, Handle<Object> receiver);
1187
1188   bool HasInPrototypeChain(Isolate* isolate, Object* object);
1189
1190   // Returns the permanent hash code associated with this object. May return
1191   // undefined if not yet created.
1192   Object* GetHash();
1193
1194   // Returns undefined for JSObjects, but returns the hash code for simple
1195   // objects.  This avoids a double lookup in the cases where we know we will
1196   // add the hash to the JSObject if it does not already exist.
1197   Object* GetSimpleHash();
1198
1199   // Returns the permanent hash code associated with this object depending on
1200   // the actual object type. May create and store a hash code if needed and none
1201   // exists.
1202   static Handle<Smi> GetOrCreateHash(Isolate* isolate, Handle<Object> object);
1203
1204   // Checks whether this object has the same value as the given one.  This
1205   // function is implemented according to ES5, section 9.12 and can be used
1206   // to implement the Harmony "egal" function.
1207   bool SameValue(Object* other);
1208
1209   // Checks whether this object has the same value as the given one.
1210   // +0 and -0 are treated equal. Everything else is the same as SameValue.
1211   // This function is implemented according to ES6, section 7.2.4 and is used
1212   // by ES6 Map and Set.
1213   bool SameValueZero(Object* other);
1214
1215   // Tries to convert an object to an array length. Returns true and sets the
1216   // output parameter if it succeeds.
1217   inline bool ToArrayLength(uint32_t* index);
1218
1219   // Tries to convert an object to an array index. Returns true and sets the
1220   // output parameter if it succeeds. Equivalent to ToArrayLength, but does not
1221   // allow kMaxUInt32.
1222   inline bool ToArrayIndex(uint32_t* index);
1223
1224   // Returns true if this is a JSValue containing a string and the index is
1225   // < the length of the string.  Used to implement [] on strings.
1226   inline bool IsStringObjectWithCharacterAt(uint32_t index);
1227
1228   DECLARE_VERIFIER(Object)
1229 #ifdef VERIFY_HEAP
1230   // Verify a pointer is a valid object pointer.
1231   static void VerifyPointer(Object* p);
1232 #endif
1233
1234   inline void VerifyApiCallResultType();
1235
1236   // Prints this object without details.
1237   void ShortPrint(FILE* out = stdout);
1238
1239   // Prints this object without details to a message accumulator.
1240   void ShortPrint(StringStream* accumulator);
1241
1242   void ShortPrint(std::ostream& os);  // NOLINT
1243
1244   DECLARE_CAST(Object)
1245
1246   // Layout description.
1247   static const int kHeaderSize = 0;  // Object does not take up any space.
1248
1249 #ifdef OBJECT_PRINT
1250   // For our gdb macros, we should perhaps change these in the future.
1251   void Print();
1252
1253   // Prints this object with details.
1254   void Print(std::ostream& os);  // NOLINT
1255 #else
1256   void Print() { ShortPrint(); }
1257   void Print(std::ostream& os) { ShortPrint(os); }  // NOLINT
1258 #endif
1259
1260  private:
1261   friend class LookupIterator;
1262   friend class PrototypeIterator;
1263
1264   // Return the map of the root of object's prototype chain.
1265   Map* GetRootMap(Isolate* isolate);
1266
1267   // Helper for SetProperty and SetSuperProperty.
1268   MUST_USE_RESULT static MaybeHandle<Object> SetPropertyInternal(
1269       LookupIterator* it, Handle<Object> value, LanguageMode language_mode,
1270       StoreFromKeyed store_mode, bool* found);
1271
1272   DISALLOW_IMPLICIT_CONSTRUCTORS(Object);
1273 };
1274
1275
1276 // In objects.h to be usable without objects-inl.h inclusion.
1277 bool Object::IsSmi() const { return HAS_SMI_TAG(this); }
1278 bool Object::IsHeapObject() const { return Internals::HasHeapObjectTag(this); }
1279
1280
1281 struct Brief {
1282   explicit Brief(const Object* const v) : value(v) {}
1283   const Object* value;
1284 };
1285
1286
1287 std::ostream& operator<<(std::ostream& os, const Brief& v);
1288
1289
1290 // Smi represents integer Numbers that can be stored in 31 bits.
1291 // Smis are immediate which means they are NOT allocated in the heap.
1292 // The this pointer has the following format: [31 bit signed int] 0
1293 // For long smis it has the following format:
1294 //     [32 bit signed int] [31 bits zero padding] 0
1295 // Smi stands for small integer.
1296 class Smi: public Object {
1297  public:
1298   // Returns the integer value.
1299   inline int value() const { return Internals::SmiValue(this); }
1300
1301   // Convert a value to a Smi object.
1302   static inline Smi* FromInt(int value) {
1303     DCHECK(Smi::IsValid(value));
1304     return reinterpret_cast<Smi*>(Internals::IntToSmi(value));
1305   }
1306
1307   static inline Smi* FromIntptr(intptr_t value) {
1308     DCHECK(Smi::IsValid(value));
1309     int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
1310     return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag);
1311   }
1312
1313   // Returns whether value can be represented in a Smi.
1314   static inline bool IsValid(intptr_t value) {
1315     bool result = Internals::IsValidSmi(value);
1316     DCHECK_EQ(result, value >= kMinValue && value <= kMaxValue);
1317     return result;
1318   }
1319
1320   DECLARE_CAST(Smi)
1321
1322   // Dispatched behavior.
1323   void SmiPrint(std::ostream& os) const;  // NOLINT
1324   DECLARE_VERIFIER(Smi)
1325
1326   static const int kMinValue =
1327       (static_cast<unsigned int>(-1)) << (kSmiValueSize - 1);
1328   static const int kMaxValue = -(kMinValue + 1);
1329
1330  private:
1331   DISALLOW_IMPLICIT_CONSTRUCTORS(Smi);
1332 };
1333
1334
1335 // Heap objects typically have a map pointer in their first word.  However,
1336 // during GC other data (e.g. mark bits, forwarding addresses) is sometimes
1337 // encoded in the first word.  The class MapWord is an abstraction of the
1338 // value in a heap object's first word.
1339 class MapWord BASE_EMBEDDED {
1340  public:
1341   // Normal state: the map word contains a map pointer.
1342
1343   // Create a map word from a map pointer.
1344   static inline MapWord FromMap(const Map* map);
1345
1346   // View this map word as a map pointer.
1347   inline Map* ToMap();
1348
1349
1350   // Scavenge collection: the map word of live objects in the from space
1351   // contains a forwarding address (a heap object pointer in the to space).
1352
1353   // True if this map word is a forwarding address for a scavenge
1354   // collection.  Only valid during a scavenge collection (specifically,
1355   // when all map words are heap object pointers, i.e. not during a full GC).
1356   inline bool IsForwardingAddress();
1357
1358   // Create a map word from a forwarding address.
1359   static inline MapWord FromForwardingAddress(HeapObject* object);
1360
1361   // View this map word as a forwarding address.
1362   inline HeapObject* ToForwardingAddress();
1363
1364   static inline MapWord FromRawValue(uintptr_t value) {
1365     return MapWord(value);
1366   }
1367
1368   inline uintptr_t ToRawValue() {
1369     return value_;
1370   }
1371
1372  private:
1373   // HeapObject calls the private constructor and directly reads the value.
1374   friend class HeapObject;
1375
1376   explicit MapWord(uintptr_t value) : value_(value) {}
1377
1378   uintptr_t value_;
1379 };
1380
1381
1382 // The content of an heap object (except for the map pointer). kTaggedValues
1383 // objects can contain both heap pointers and Smis, kMixedValues can contain
1384 // heap pointers, Smis, and raw values (e.g. doubles or strings), and kRawValues
1385 // objects can contain raw values and Smis.
1386 enum class HeapObjectContents { kTaggedValues, kMixedValues, kRawValues };
1387
1388
1389 // HeapObject is the superclass for all classes describing heap allocated
1390 // objects.
1391 class HeapObject: public Object {
1392  public:
1393   // [map]: Contains a map which contains the object's reflective
1394   // information.
1395   inline Map* map() const;
1396   inline void set_map(Map* value);
1397   // The no-write-barrier version.  This is OK if the object is white and in
1398   // new space, or if the value is an immortal immutable object, like the maps
1399   // of primitive (non-JS) objects like strings, heap numbers etc.
1400   inline void set_map_no_write_barrier(Map* value);
1401
1402   // Get the map using acquire load.
1403   inline Map* synchronized_map();
1404   inline MapWord synchronized_map_word() const;
1405
1406   // Set the map using release store
1407   inline void synchronized_set_map(Map* value);
1408   inline void synchronized_set_map_no_write_barrier(Map* value);
1409   inline void synchronized_set_map_word(MapWord map_word);
1410
1411   // During garbage collection, the map word of a heap object does not
1412   // necessarily contain a map pointer.
1413   inline MapWord map_word() const;
1414   inline void set_map_word(MapWord map_word);
1415
1416   // The Heap the object was allocated in. Used also to access Isolate.
1417   inline Heap* GetHeap() const;
1418
1419   // Convenience method to get current isolate.
1420   inline Isolate* GetIsolate() const;
1421
1422   // Converts an address to a HeapObject pointer.
1423   static inline HeapObject* FromAddress(Address address) {
1424     DCHECK_TAG_ALIGNED(address);
1425     return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
1426   }
1427
1428   // Returns the address of this HeapObject.
1429   inline Address address() {
1430     return reinterpret_cast<Address>(this) - kHeapObjectTag;
1431   }
1432
1433   // Iterates over pointers contained in the object (including the Map)
1434   void Iterate(ObjectVisitor* v);
1435
1436   // Iterates over all pointers contained in the object except the
1437   // first map pointer.  The object type is given in the first
1438   // parameter. This function does not access the map pointer in the
1439   // object, and so is safe to call while the map pointer is modified.
1440   void IterateBody(InstanceType type, int object_size, ObjectVisitor* v);
1441
1442   // Returns the heap object's size in bytes
1443   inline int Size();
1444
1445   // Indicates what type of values this heap object may contain.
1446   inline HeapObjectContents ContentType();
1447
1448   // Given a heap object's map pointer, returns the heap size in bytes
1449   // Useful when the map pointer field is used for other purposes.
1450   // GC internal.
1451   inline int SizeFromMap(Map* map);
1452
1453   // Returns the field at offset in obj, as a read/write Object* reference.
1454   // Does no checking, and is safe to use during GC, while maps are invalid.
1455   // Does not invoke write barrier, so should only be assigned to
1456   // during marking GC.
1457   static inline Object** RawField(HeapObject* obj, int offset);
1458
1459   // Adds the |code| object related to |name| to the code cache of this map. If
1460   // this map is a dictionary map that is shared, the map copied and installed
1461   // onto the object.
1462   static void UpdateMapCodeCache(Handle<HeapObject> object,
1463                                  Handle<Name> name,
1464                                  Handle<Code> code);
1465
1466   DECLARE_CAST(HeapObject)
1467
1468   // Return the write barrier mode for this. Callers of this function
1469   // must be able to present a reference to an DisallowHeapAllocation
1470   // object as a sign that they are not going to use this function
1471   // from code that allocates and thus invalidates the returned write
1472   // barrier mode.
1473   inline WriteBarrierMode GetWriteBarrierMode(
1474       const DisallowHeapAllocation& promise);
1475
1476   // Dispatched behavior.
1477   void HeapObjectShortPrint(std::ostream& os);  // NOLINT
1478 #ifdef OBJECT_PRINT
1479   void PrintHeader(std::ostream& os, const char* id);  // NOLINT
1480 #endif
1481   DECLARE_PRINTER(HeapObject)
1482   DECLARE_VERIFIER(HeapObject)
1483 #ifdef VERIFY_HEAP
1484   inline void VerifyObjectField(int offset);
1485   inline void VerifySmiField(int offset);
1486
1487   // Verify a pointer is a valid HeapObject pointer that points to object
1488   // areas in the heap.
1489   static void VerifyHeapPointer(Object* p);
1490 #endif
1491
1492   inline AllocationAlignment RequiredAlignment();
1493
1494   // Layout description.
1495   // First field in a heap object is map.
1496   static const int kMapOffset = Object::kHeaderSize;
1497   static const int kHeaderSize = kMapOffset + kPointerSize;
1498
1499   STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset);
1500
1501  protected:
1502   // helpers for calling an ObjectVisitor to iterate over pointers in the
1503   // half-open range [start, end) specified as integer offsets
1504   inline void IteratePointers(ObjectVisitor* v, int start, int end);
1505   // as above, for the single element at "offset"
1506   inline void IteratePointer(ObjectVisitor* v, int offset);
1507   // as above, for the next code link of a code object.
1508   inline void IterateNextCodeLink(ObjectVisitor* v, int offset);
1509
1510  private:
1511   DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject);
1512 };
1513
1514
1515 // This class describes a body of an object of a fixed size
1516 // in which all pointer fields are located in the [start_offset, end_offset)
1517 // interval.
1518 template<int start_offset, int end_offset, int size>
1519 class FixedBodyDescriptor {
1520  public:
1521   static const int kStartOffset = start_offset;
1522   static const int kEndOffset = end_offset;
1523   static const int kSize = size;
1524
1525   static inline void IterateBody(HeapObject* obj, ObjectVisitor* v);
1526
1527   template<typename StaticVisitor>
1528   static inline void IterateBody(HeapObject* obj) {
1529     StaticVisitor::VisitPointers(HeapObject::RawField(obj, start_offset),
1530                                  HeapObject::RawField(obj, end_offset));
1531   }
1532 };
1533
1534
1535 // This class describes a body of an object of a variable size
1536 // in which all pointer fields are located in the [start_offset, object_size)
1537 // interval.
1538 template<int start_offset>
1539 class FlexibleBodyDescriptor {
1540  public:
1541   static const int kStartOffset = start_offset;
1542
1543   static inline void IterateBody(HeapObject* obj,
1544                                  int object_size,
1545                                  ObjectVisitor* v);
1546
1547   template<typename StaticVisitor>
1548   static inline void IterateBody(HeapObject* obj, int object_size) {
1549     StaticVisitor::VisitPointers(HeapObject::RawField(obj, start_offset),
1550                                  HeapObject::RawField(obj, object_size));
1551   }
1552 };
1553
1554
1555 // The HeapNumber class describes heap allocated numbers that cannot be
1556 // represented in a Smi (small integer)
1557 class HeapNumber: public HeapObject {
1558  public:
1559   // [value]: number value.
1560   inline double value() const;
1561   inline void set_value(double value);
1562
1563   DECLARE_CAST(HeapNumber)
1564
1565   // Dispatched behavior.
1566   bool HeapNumberBooleanValue();
1567
1568   void HeapNumberPrint(std::ostream& os);  // NOLINT
1569   DECLARE_VERIFIER(HeapNumber)
1570
1571   inline int get_exponent();
1572   inline int get_sign();
1573
1574   // Layout description.
1575   static const int kValueOffset = HeapObject::kHeaderSize;
1576   // IEEE doubles are two 32 bit words.  The first is just mantissa, the second
1577   // is a mixture of sign, exponent and mantissa. The offsets of two 32 bit
1578   // words within double numbers are endian dependent and they are set
1579   // accordingly.
1580 #if defined(V8_TARGET_LITTLE_ENDIAN)
1581   static const int kMantissaOffset = kValueOffset;
1582   static const int kExponentOffset = kValueOffset + 4;
1583 #elif defined(V8_TARGET_BIG_ENDIAN)
1584   static const int kMantissaOffset = kValueOffset + 4;
1585   static const int kExponentOffset = kValueOffset;
1586 #else
1587 #error Unknown byte ordering
1588 #endif
1589
1590   static const int kSize = kValueOffset + kDoubleSize;
1591   static const uint32_t kSignMask = 0x80000000u;
1592   static const uint32_t kExponentMask = 0x7ff00000u;
1593   static const uint32_t kMantissaMask = 0xfffffu;
1594   static const int kMantissaBits = 52;
1595   static const int kExponentBits = 11;
1596   static const int kExponentBias = 1023;
1597   static const int kExponentShift = 20;
1598   static const int kInfinityOrNanExponent =
1599       (kExponentMask >> kExponentShift) - kExponentBias;
1600   static const int kMantissaBitsInTopWord = 20;
1601   static const int kNonMantissaBitsInTopWord = 12;
1602
1603  private:
1604   DISALLOW_IMPLICIT_CONSTRUCTORS(HeapNumber);
1605 };
1606
1607
1608 // The Simd128Value class describes heap allocated 128 bit SIMD values.
1609 class Simd128Value : public HeapObject {
1610  public:
1611   DECLARE_CAST(Simd128Value)
1612
1613   DECLARE_PRINTER(Simd128Value)
1614   DECLARE_VERIFIER(Simd128Value)
1615
1616   static Handle<String> ToString(Handle<Simd128Value> input);
1617
1618   // Equality operations.
1619   inline bool Equals(Simd128Value* that);
1620
1621   // Checks that another instance is bit-wise equal.
1622   bool BitwiseEquals(const Simd128Value* other) const;
1623   // Computes a hash from the 128 bit value, viewed as 4 32-bit integers.
1624   uint32_t Hash() const;
1625   // Copies the 16 bytes of SIMD data to the destination address.
1626   void CopyBits(void* destination) const;
1627
1628   // Layout description.
1629   static const int kValueOffset = HeapObject::kHeaderSize;
1630   static const int kSize = kValueOffset + kSimd128Size;
1631
1632  private:
1633   DISALLOW_IMPLICIT_CONSTRUCTORS(Simd128Value);
1634 };
1635
1636
1637 // V has parameters (TYPE, Type, type, lane count, lane type)
1638 #define SIMD128_TYPES(V)                       \
1639   V(FLOAT32X4, Float32x4, float32x4, 4, float) \
1640   V(INT32X4, Int32x4, int32x4, 4, int32_t)     \
1641   V(UINT32X4, Uint32x4, uint32x4, 4, uint32_t) \
1642   V(BOOL32X4, Bool32x4, bool32x4, 4, bool)     \
1643   V(INT16X8, Int16x8, int16x8, 8, int16_t)     \
1644   V(UINT16X8, Uint16x8, uint16x8, 8, uint16_t) \
1645   V(BOOL16X8, Bool16x8, bool16x8, 8, bool)     \
1646   V(INT8X16, Int8x16, int8x16, 16, int8_t)     \
1647   V(UINT8X16, Uint8x16, uint8x16, 16, uint8_t) \
1648   V(BOOL8X16, Bool8x16, bool8x16, 16, bool)
1649
1650 #define SIMD128_VALUE_CLASS(TYPE, Type, type, lane_count, lane_type) \
1651   class Type final : public Simd128Value {                           \
1652    public:                                                           \
1653     inline lane_type get_lane(int lane) const;                       \
1654     inline void set_lane(int lane, lane_type value);                 \
1655                                                                      \
1656     DECLARE_CAST(Type)                                               \
1657                                                                      \
1658     DECLARE_PRINTER(Type)                                            \
1659                                                                      \
1660     static Handle<String> ToString(Handle<Type> input);              \
1661                                                                      \
1662     inline bool Equals(Type* that);                                  \
1663                                                                      \
1664    private:                                                          \
1665     DISALLOW_IMPLICIT_CONSTRUCTORS(Type);                            \
1666   };
1667 SIMD128_TYPES(SIMD128_VALUE_CLASS)
1668 #undef SIMD128_VALUE_CLASS
1669
1670
1671 enum EnsureElementsMode {
1672   DONT_ALLOW_DOUBLE_ELEMENTS,
1673   ALLOW_COPIED_DOUBLE_ELEMENTS,
1674   ALLOW_CONVERTED_DOUBLE_ELEMENTS
1675 };
1676
1677
1678 // Indicator for one component of an AccessorPair.
1679 enum AccessorComponent {
1680   ACCESSOR_GETTER,
1681   ACCESSOR_SETTER
1682 };
1683
1684
1685 // JSReceiver includes types on which properties can be defined, i.e.,
1686 // JSObject and JSProxy.
1687 class JSReceiver: public HeapObject {
1688  public:
1689   DECLARE_CAST(JSReceiver)
1690
1691   // ES6 section 7.1.1 ToPrimitive
1692   MUST_USE_RESULT static MaybeHandle<Object> ToPrimitive(
1693       Handle<JSReceiver> receiver,
1694       ToPrimitiveHint hint = ToPrimitiveHint::kDefault);
1695   MUST_USE_RESULT static MaybeHandle<Object> OrdinaryToPrimitive(
1696       Handle<JSReceiver> receiver, OrdinaryToPrimitiveHint hint);
1697
1698   // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6.
1699   MUST_USE_RESULT static inline Maybe<bool> HasProperty(
1700       Handle<JSReceiver> object, Handle<Name> name);
1701   MUST_USE_RESULT static inline Maybe<bool> HasOwnProperty(Handle<JSReceiver>,
1702                                                            Handle<Name> name);
1703   MUST_USE_RESULT static inline Maybe<bool> HasElement(
1704       Handle<JSReceiver> object, uint32_t index);
1705   MUST_USE_RESULT static inline Maybe<bool> HasOwnElement(
1706       Handle<JSReceiver> object, uint32_t index);
1707
1708   // Implementation of [[Delete]], ECMA-262 5th edition, section 8.12.7.
1709   MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyOrElement(
1710       Handle<JSReceiver> object, Handle<Name> name,
1711       LanguageMode language_mode = SLOPPY);
1712   MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty(
1713       Handle<JSReceiver> object, Handle<Name> name,
1714       LanguageMode language_mode = SLOPPY);
1715   MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty(
1716       LookupIterator* it, LanguageMode language_mode);
1717   MUST_USE_RESULT static MaybeHandle<Object> DeleteElement(
1718       Handle<JSReceiver> object, uint32_t index,
1719       LanguageMode language_mode = SLOPPY);
1720
1721   // Tests for the fast common case for property enumeration.
1722   bool IsSimpleEnum();
1723
1724   // Returns the class name ([[Class]] property in the specification).
1725   String* class_name();
1726
1727   // Returns the constructor name (the name (possibly, inferred name) of the
1728   // function that was used to instantiate the object).
1729   String* constructor_name();
1730
1731   MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetPropertyAttributes(
1732       Handle<JSReceiver> object, Handle<Name> name);
1733   MUST_USE_RESULT static inline Maybe<PropertyAttributes>
1734   GetOwnPropertyAttributes(Handle<JSReceiver> object, Handle<Name> name);
1735
1736   MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetElementAttributes(
1737       Handle<JSReceiver> object, uint32_t index);
1738   MUST_USE_RESULT static inline Maybe<PropertyAttributes>
1739   GetOwnElementAttributes(Handle<JSReceiver> object, uint32_t index);
1740
1741   MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes(
1742       LookupIterator* it);
1743
1744
1745   static Handle<Object> GetDataProperty(Handle<JSReceiver> object,
1746                                         Handle<Name> name);
1747   static Handle<Object> GetDataProperty(LookupIterator* it);
1748
1749
1750   // Retrieves a permanent object identity hash code. The undefined value might
1751   // be returned in case no hash was created yet.
1752   inline Object* GetIdentityHash();
1753
1754   // Retrieves a permanent object identity hash code. May create and store a
1755   // hash code if needed and none exists.
1756   inline static Handle<Smi> GetOrCreateIdentityHash(
1757       Handle<JSReceiver> object);
1758
1759   enum KeyCollectionType { OWN_ONLY, INCLUDE_PROTOS };
1760
1761   // Computes the enumerable keys for a JSObject. Used for implementing
1762   // "for (n in object) { }".
1763   MUST_USE_RESULT static MaybeHandle<FixedArray> GetKeys(
1764       Handle<JSReceiver> object,
1765       KeyCollectionType type);
1766
1767  private:
1768   DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver);
1769 };
1770
1771
1772 // The JSObject describes real heap allocated JavaScript objects with
1773 // properties.
1774 // Note that the map of JSObject changes during execution to enable inline
1775 // caching.
1776 class JSObject: public JSReceiver {
1777  public:
1778   // [properties]: Backing storage for properties.
1779   // properties is a FixedArray in the fast case and a Dictionary in the
1780   // slow case.
1781   DECL_ACCESSORS(properties, FixedArray)  // Get and set fast properties.
1782   inline void initialize_properties();
1783   inline bool HasFastProperties();
1784   // Gets slow properties for non-global objects.
1785   inline NameDictionary* property_dictionary();
1786   // Gets global object properties.
1787   inline GlobalDictionary* global_dictionary();
1788
1789   // [elements]: The elements (properties with names that are integers).
1790   //
1791   // Elements can be in two general modes: fast and slow. Each mode
1792   // corrensponds to a set of object representations of elements that
1793   // have something in common.
1794   //
1795   // In the fast mode elements is a FixedArray and so each element can
1796   // be quickly accessed. This fact is used in the generated code. The
1797   // elements array can have one of three maps in this mode:
1798   // fixed_array_map, sloppy_arguments_elements_map or
1799   // fixed_cow_array_map (for copy-on-write arrays). In the latter case
1800   // the elements array may be shared by a few objects and so before
1801   // writing to any element the array must be copied. Use
1802   // EnsureWritableFastElements in this case.
1803   //
1804   // In the slow mode the elements is either a NumberDictionary, a
1805   // FixedArray parameter map for a (sloppy) arguments object.
1806   DECL_ACCESSORS(elements, FixedArrayBase)
1807   inline void initialize_elements();
1808   static void ResetElements(Handle<JSObject> object);
1809   static inline void SetMapAndElements(Handle<JSObject> object,
1810                                        Handle<Map> map,
1811                                        Handle<FixedArrayBase> elements);
1812   inline ElementsKind GetElementsKind();
1813   ElementsAccessor* GetElementsAccessor();
1814   // Returns true if an object has elements of FAST_SMI_ELEMENTS ElementsKind.
1815   inline bool HasFastSmiElements();
1816   // Returns true if an object has elements of FAST_ELEMENTS ElementsKind.
1817   inline bool HasFastObjectElements();
1818   // Returns true if an object has elements of FAST_ELEMENTS or
1819   // FAST_SMI_ONLY_ELEMENTS.
1820   inline bool HasFastSmiOrObjectElements();
1821   // Returns true if an object has any of the fast elements kinds.
1822   inline bool HasFastElements();
1823   // Returns true if an object has elements of FAST_DOUBLE_ELEMENTS
1824   // ElementsKind.
1825   inline bool HasFastDoubleElements();
1826   // Returns true if an object has elements of FAST_HOLEY_*_ELEMENTS
1827   // ElementsKind.
1828   inline bool HasFastHoleyElements();
1829   inline bool HasSloppyArgumentsElements();
1830   inline bool HasDictionaryElements();
1831
1832   inline bool HasFixedTypedArrayElements();
1833
1834   inline bool HasFixedUint8ClampedElements();
1835   inline bool HasFixedArrayElements();
1836   inline bool HasFixedInt8Elements();
1837   inline bool HasFixedUint8Elements();
1838   inline bool HasFixedInt16Elements();
1839   inline bool HasFixedUint16Elements();
1840   inline bool HasFixedInt32Elements();
1841   inline bool HasFixedUint32Elements();
1842   inline bool HasFixedFloat32Elements();
1843   inline bool HasFixedFloat64Elements();
1844
1845   inline bool HasFastArgumentsElements();
1846   inline bool HasSlowArgumentsElements();
1847   inline SeededNumberDictionary* element_dictionary();  // Gets slow elements.
1848
1849   // Requires: HasFastElements().
1850   static Handle<FixedArray> EnsureWritableFastElements(
1851       Handle<JSObject> object);
1852
1853   // Collects elements starting at index 0.
1854   // Undefined values are placed after non-undefined values.
1855   // Returns the number of non-undefined values.
1856   static Handle<Object> PrepareElementsForSort(Handle<JSObject> object,
1857                                                uint32_t limit);
1858   // As PrepareElementsForSort, but only on objects where elements is
1859   // a dictionary, and it will stay a dictionary.  Collates undefined and
1860   // unexisting elements below limit from position zero of the elements.
1861   static Handle<Object> PrepareSlowElementsForSort(Handle<JSObject> object,
1862                                                    uint32_t limit);
1863
1864   MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithInterceptor(
1865       LookupIterator* it, Handle<Object> value);
1866
1867   // SetLocalPropertyIgnoreAttributes converts callbacks to fields. We need to
1868   // grant an exemption to ExecutableAccessor callbacks in some cases.
1869   enum ExecutableAccessorInfoHandling { DEFAULT_HANDLING, DONT_FORCE_FIELD };
1870
1871   MUST_USE_RESULT static MaybeHandle<Object> DefineOwnPropertyIgnoreAttributes(
1872       LookupIterator* it, Handle<Object> value, PropertyAttributes attributes,
1873       ExecutableAccessorInfoHandling handling = DEFAULT_HANDLING);
1874
1875   MUST_USE_RESULT static MaybeHandle<Object> SetOwnPropertyIgnoreAttributes(
1876       Handle<JSObject> object, Handle<Name> name, Handle<Object> value,
1877       PropertyAttributes attributes,
1878       ExecutableAccessorInfoHandling handling = DEFAULT_HANDLING);
1879
1880   MUST_USE_RESULT static MaybeHandle<Object> SetOwnElementIgnoreAttributes(
1881       Handle<JSObject> object, uint32_t index, Handle<Object> value,
1882       PropertyAttributes attributes,
1883       ExecutableAccessorInfoHandling handling = DEFAULT_HANDLING);
1884
1885   // Equivalent to one of the above depending on whether |name| can be converted
1886   // to an array index.
1887   MUST_USE_RESULT static MaybeHandle<Object>
1888   DefinePropertyOrElementIgnoreAttributes(
1889       Handle<JSObject> object, Handle<Name> name, Handle<Object> value,
1890       PropertyAttributes attributes = NONE,
1891       ExecutableAccessorInfoHandling handling = DEFAULT_HANDLING);
1892
1893   // Adds or reconfigures a property to attributes NONE. It will fail when it
1894   // cannot.
1895   MUST_USE_RESULT static Maybe<bool> CreateDataProperty(LookupIterator* it,
1896                                                         Handle<Object> value);
1897
1898   static void AddProperty(Handle<JSObject> object, Handle<Name> name,
1899                           Handle<Object> value, PropertyAttributes attributes);
1900
1901   MUST_USE_RESULT static MaybeHandle<Object> AddDataElement(
1902       Handle<JSObject> receiver, uint32_t index, Handle<Object> value,
1903       PropertyAttributes attributes);
1904
1905   // Extend the receiver with a single fast property appeared first in the
1906   // passed map. This also extends the property backing store if necessary.
1907   static void AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map);
1908
1909   // Migrates the given object to a map whose field representations are the
1910   // lowest upper bound of all known representations for that field.
1911   static void MigrateInstance(Handle<JSObject> instance);
1912
1913   // Migrates the given object only if the target map is already available,
1914   // or returns false if such a map is not yet available.
1915   static bool TryMigrateInstance(Handle<JSObject> instance);
1916
1917   // Sets the property value in a normalized object given (key, value, details).
1918   // Handles the special representation of JS global objects.
1919   static void SetNormalizedProperty(Handle<JSObject> object, Handle<Name> name,
1920                                     Handle<Object> value,
1921                                     PropertyDetails details);
1922   static void SetDictionaryElement(Handle<JSObject> object, uint32_t index,
1923                                    Handle<Object> value,
1924                                    PropertyAttributes attributes);
1925   static void SetDictionaryArgumentsElement(Handle<JSObject> object,
1926                                             uint32_t index,
1927                                             Handle<Object> value,
1928                                             PropertyAttributes attributes);
1929
1930   static void OptimizeAsPrototype(Handle<JSObject> object,
1931                                   PrototypeOptimizationMode mode);
1932   static void ReoptimizeIfPrototype(Handle<JSObject> object);
1933   static void LazyRegisterPrototypeUser(Handle<Map> user, Isolate* isolate);
1934   static bool UnregisterPrototypeUser(Handle<Map> user, Isolate* isolate);
1935   static void InvalidatePrototypeChains(Map* map);
1936
1937   // Alternative implementation of WeakFixedArray::NullCallback.
1938   class PrototypeRegistryCompactionCallback {
1939    public:
1940     static void Callback(Object* value, int old_index, int new_index);
1941   };
1942
1943   // Retrieve interceptors.
1944   InterceptorInfo* GetNamedInterceptor();
1945   InterceptorInfo* GetIndexedInterceptor();
1946
1947   // Used from JSReceiver.
1948   MUST_USE_RESULT static Maybe<PropertyAttributes>
1949   GetPropertyAttributesWithInterceptor(LookupIterator* it);
1950   MUST_USE_RESULT static Maybe<PropertyAttributes>
1951       GetPropertyAttributesWithFailedAccessCheck(LookupIterator* it);
1952
1953   // Retrieves an AccessorPair property from the given object. Might return
1954   // undefined if the property doesn't exist or is of a different kind.
1955   MUST_USE_RESULT static MaybeHandle<Object> GetAccessor(
1956       Handle<JSObject> object,
1957       Handle<Name> name,
1958       AccessorComponent component);
1959
1960   // Defines an AccessorPair property on the given object.
1961   // TODO(mstarzinger): Rename to SetAccessor().
1962   static MaybeHandle<Object> DefineAccessor(Handle<JSObject> object,
1963                                             Handle<Name> name,
1964                                             Handle<Object> getter,
1965                                             Handle<Object> setter,
1966                                             PropertyAttributes attributes);
1967
1968   // Defines an AccessorInfo property on the given object.
1969   MUST_USE_RESULT static MaybeHandle<Object> SetAccessor(
1970       Handle<JSObject> object,
1971       Handle<AccessorInfo> info);
1972
1973   // The result must be checked first for exceptions. If there's no exception,
1974   // the output parameter |done| indicates whether the interceptor has a result
1975   // or not.
1976   MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithInterceptor(
1977       LookupIterator* it, bool* done);
1978
1979   // Accessors for hidden properties object.
1980   //
1981   // Hidden properties are not own properties of the object itself.
1982   // Instead they are stored in an auxiliary structure kept as an own
1983   // property with a special name Heap::hidden_string(). But if the
1984   // receiver is a JSGlobalProxy then the auxiliary object is a property
1985   // of its prototype, and if it's a detached proxy, then you can't have
1986   // hidden properties.
1987
1988   // Sets a hidden property on this object. Returns this object if successful,
1989   // undefined if called on a detached proxy.
1990   static Handle<Object> SetHiddenProperty(Handle<JSObject> object,
1991                                           Handle<Name> key,
1992                                           Handle<Object> value);
1993   // Gets the value of a hidden property with the given key. Returns the hole
1994   // if the property doesn't exist (or if called on a detached proxy),
1995   // otherwise returns the value set for the key.
1996   Object* GetHiddenProperty(Handle<Name> key);
1997   // Deletes a hidden property. Deleting a non-existing property is
1998   // considered successful.
1999   static void DeleteHiddenProperty(Handle<JSObject> object,
2000                                    Handle<Name> key);
2001   // Returns true if the object has a property with the hidden string as name.
2002   static bool HasHiddenProperties(Handle<JSObject> object);
2003
2004   static void SetIdentityHash(Handle<JSObject> object, Handle<Smi> hash);
2005
2006   static void ValidateElements(Handle<JSObject> object);
2007
2008   // Makes sure that this object can contain HeapObject as elements.
2009   static inline void EnsureCanContainHeapObjectElements(Handle<JSObject> obj);
2010
2011   // Makes sure that this object can contain the specified elements.
2012   static inline void EnsureCanContainElements(
2013       Handle<JSObject> object,
2014       Object** elements,
2015       uint32_t count,
2016       EnsureElementsMode mode);
2017   static inline void EnsureCanContainElements(
2018       Handle<JSObject> object,
2019       Handle<FixedArrayBase> elements,
2020       uint32_t length,
2021       EnsureElementsMode mode);
2022   static void EnsureCanContainElements(
2023       Handle<JSObject> object,
2024       Arguments* arguments,
2025       uint32_t first_arg,
2026       uint32_t arg_count,
2027       EnsureElementsMode mode);
2028
2029   // Would we convert a fast elements array to dictionary mode given
2030   // an access at key?
2031   bool WouldConvertToSlowElements(uint32_t index);
2032
2033   // Computes the new capacity when expanding the elements of a JSObject.
2034   static uint32_t NewElementsCapacity(uint32_t old_capacity) {
2035     // (old_capacity + 50%) + 16
2036     return old_capacity + (old_capacity >> 1) + 16;
2037   }
2038
2039   // These methods do not perform access checks!
2040   static void UpdateAllocationSite(Handle<JSObject> object,
2041                                    ElementsKind to_kind);
2042
2043   // Lookup interceptors are used for handling properties controlled by host
2044   // objects.
2045   inline bool HasNamedInterceptor();
2046   inline bool HasIndexedInterceptor();
2047
2048   // Computes the enumerable keys from interceptors. Used for debug mirrors and
2049   // by JSReceiver::GetKeys.
2050   MUST_USE_RESULT static MaybeHandle<JSObject> GetKeysForNamedInterceptor(
2051       Handle<JSObject> object,
2052       Handle<JSReceiver> receiver);
2053   MUST_USE_RESULT static MaybeHandle<JSObject> GetKeysForIndexedInterceptor(
2054       Handle<JSObject> object,
2055       Handle<JSReceiver> receiver);
2056
2057   // Support functions for v8 api (needed for correct interceptor behavior).
2058   MUST_USE_RESULT static Maybe<bool> HasRealNamedProperty(
2059       Handle<JSObject> object, Handle<Name> name);
2060   MUST_USE_RESULT static Maybe<bool> HasRealElementProperty(
2061       Handle<JSObject> object, uint32_t index);
2062   MUST_USE_RESULT static Maybe<bool> HasRealNamedCallbackProperty(
2063       Handle<JSObject> object, Handle<Name> name);
2064
2065   // Get the header size for a JSObject.  Used to compute the index of
2066   // internal fields as well as the number of internal fields.
2067   inline int GetHeaderSize();
2068
2069   inline int GetInternalFieldCount();
2070   inline int GetInternalFieldOffset(int index);
2071   inline Object* GetInternalField(int index);
2072   inline void SetInternalField(int index, Object* value);
2073   inline void SetInternalField(int index, Smi* value);
2074
2075   // Returns the number of properties on this object filtering out properties
2076   // with the specified attributes (ignoring interceptors).
2077   int NumberOfOwnProperties(PropertyAttributes filter = NONE);
2078   // Fill in details for properties into storage starting at the specified
2079   // index. Returns the number of properties added.
2080   int GetOwnPropertyNames(FixedArray* storage, int index,
2081                           PropertyAttributes filter = NONE);
2082
2083   // Returns the number of properties on this object filtering out properties
2084   // with the specified attributes (ignoring interceptors).
2085   int NumberOfOwnElements(PropertyAttributes filter);
2086   // Returns the number of enumerable elements (ignoring interceptors).
2087   int NumberOfEnumElements();
2088   // Returns the number of elements on this object filtering out elements
2089   // with the specified attributes (ignoring interceptors).
2090   int GetOwnElementKeys(FixedArray* storage, PropertyAttributes filter);
2091   // Count and fill in the enumerable elements into storage.
2092   // (storage->length() == NumberOfEnumElements()).
2093   // If storage is NULL, will count the elements without adding
2094   // them to any storage.
2095   // Returns the number of enumerable elements.
2096   int GetEnumElementKeys(FixedArray* storage);
2097
2098   static Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object,
2099                                                 bool cache_result);
2100
2101   // Returns a new map with all transitions dropped from the object's current
2102   // map and the ElementsKind set.
2103   static Handle<Map> GetElementsTransitionMap(Handle<JSObject> object,
2104                                               ElementsKind to_kind);
2105   static void TransitionElementsKind(Handle<JSObject> object,
2106                                      ElementsKind to_kind);
2107
2108   // Always use this to migrate an object to a new map.
2109   // |expected_additional_properties| is only used for fast-to-slow transitions
2110   // and ignored otherwise.
2111   static void MigrateToMap(Handle<JSObject> object, Handle<Map> new_map,
2112                            int expected_additional_properties = 0);
2113
2114   // Convert the object to use the canonical dictionary
2115   // representation. If the object is expected to have additional properties
2116   // added this number can be indicated to have the backing store allocated to
2117   // an initial capacity for holding these properties.
2118   static void NormalizeProperties(Handle<JSObject> object,
2119                                   PropertyNormalizationMode mode,
2120                                   int expected_additional_properties,
2121                                   const char* reason);
2122
2123   // Convert and update the elements backing store to be a
2124   // SeededNumberDictionary dictionary.  Returns the backing after conversion.
2125   static Handle<SeededNumberDictionary> NormalizeElements(
2126       Handle<JSObject> object);
2127
2128   void RequireSlowElements(SeededNumberDictionary* dictionary);
2129
2130   // Transform slow named properties to fast variants.
2131   static void MigrateSlowToFast(Handle<JSObject> object,
2132                                 int unused_property_fields, const char* reason);
2133
2134   inline bool IsUnboxedDoubleField(FieldIndex index);
2135
2136   // Access fast-case object properties at index.
2137   static Handle<Object> FastPropertyAt(Handle<JSObject> object,
2138                                        Representation representation,
2139                                        FieldIndex index);
2140   inline Object* RawFastPropertyAt(FieldIndex index);
2141   inline double RawFastDoublePropertyAt(FieldIndex index);
2142
2143   inline void FastPropertyAtPut(FieldIndex index, Object* value);
2144   inline void RawFastPropertyAtPut(FieldIndex index, Object* value);
2145   inline void RawFastDoublePropertyAtPut(FieldIndex index, double value);
2146   inline void WriteToField(int descriptor, Object* value);
2147
2148   // Access to in object properties.
2149   inline int GetInObjectPropertyOffset(int index);
2150   inline Object* InObjectPropertyAt(int index);
2151   inline Object* InObjectPropertyAtPut(int index,
2152                                        Object* value,
2153                                        WriteBarrierMode mode
2154                                        = UPDATE_WRITE_BARRIER);
2155
2156   // Set the object's prototype (only JSReceiver and null are allowed values).
2157   MUST_USE_RESULT static MaybeHandle<Object> SetPrototype(
2158       Handle<JSObject> object, Handle<Object> value, bool from_javascript);
2159
2160   // Initializes the body after properties slot, properties slot is
2161   // initialized by set_properties.  Fill the pre-allocated fields with
2162   // pre_allocated_value and the rest with filler_value.
2163   // Note: this call does not update write barrier, the caller is responsible
2164   // to ensure that |filler_value| can be collected without WB here.
2165   inline void InitializeBody(Map* map,
2166                              Object* pre_allocated_value,
2167                              Object* filler_value);
2168
2169   // Check whether this object references another object
2170   bool ReferencesObject(Object* obj);
2171
2172   // Disalow further properties to be added to the oject.
2173   MUST_USE_RESULT static MaybeHandle<Object> PreventExtensions(
2174       Handle<JSObject> object);
2175
2176   bool IsExtensible();
2177
2178   // ES5 Object.seal
2179   MUST_USE_RESULT static MaybeHandle<Object> Seal(Handle<JSObject> object);
2180
2181   // ES5 Object.freeze
2182   MUST_USE_RESULT static MaybeHandle<Object> Freeze(Handle<JSObject> object);
2183
2184   // Called the first time an object is observed with ES7 Object.observe.
2185   static void SetObserved(Handle<JSObject> object);
2186
2187   // Copy object.
2188   enum DeepCopyHints { kNoHints = 0, kObjectIsShallow = 1 };
2189
2190   MUST_USE_RESULT static MaybeHandle<JSObject> DeepCopy(
2191       Handle<JSObject> object,
2192       AllocationSiteUsageContext* site_context,
2193       DeepCopyHints hints = kNoHints);
2194   MUST_USE_RESULT static MaybeHandle<JSObject> DeepWalk(
2195       Handle<JSObject> object,
2196       AllocationSiteCreationContext* site_context);
2197
2198   DECLARE_CAST(JSObject)
2199
2200   // Dispatched behavior.
2201   void JSObjectShortPrint(StringStream* accumulator);
2202   DECLARE_PRINTER(JSObject)
2203   DECLARE_VERIFIER(JSObject)
2204 #ifdef OBJECT_PRINT
2205   void PrintProperties(std::ostream& os);   // NOLINT
2206   void PrintElements(std::ostream& os);     // NOLINT
2207 #endif
2208 #if defined(DEBUG) || defined(OBJECT_PRINT)
2209   void PrintTransitions(std::ostream& os);  // NOLINT
2210 #endif
2211
2212   static void PrintElementsTransition(
2213       FILE* file, Handle<JSObject> object,
2214       ElementsKind from_kind, Handle<FixedArrayBase> from_elements,
2215       ElementsKind to_kind, Handle<FixedArrayBase> to_elements);
2216
2217   void PrintInstanceMigration(FILE* file, Map* original_map, Map* new_map);
2218
2219 #ifdef DEBUG
2220   // Structure for collecting spill information about JSObjects.
2221   class SpillInformation {
2222    public:
2223     void Clear();
2224     void Print();
2225     int number_of_objects_;
2226     int number_of_objects_with_fast_properties_;
2227     int number_of_objects_with_fast_elements_;
2228     int number_of_fast_used_fields_;
2229     int number_of_fast_unused_fields_;
2230     int number_of_slow_used_properties_;
2231     int number_of_slow_unused_properties_;
2232     int number_of_fast_used_elements_;
2233     int number_of_fast_unused_elements_;
2234     int number_of_slow_used_elements_;
2235     int number_of_slow_unused_elements_;
2236   };
2237
2238   void IncrementSpillStatistics(SpillInformation* info);
2239 #endif
2240
2241 #ifdef VERIFY_HEAP
2242   // If a GC was caused while constructing this object, the elements pointer
2243   // may point to a one pointer filler map. The object won't be rooted, but
2244   // our heap verification code could stumble across it.
2245   bool ElementsAreSafeToExamine();
2246 #endif
2247
2248   Object* SlowReverseLookup(Object* value);
2249
2250   // Maximal number of elements (numbered 0 .. kMaxElementCount - 1).
2251   // Also maximal value of JSArray's length property.
2252   static const uint32_t kMaxElementCount = 0xffffffffu;
2253
2254   // Constants for heuristics controlling conversion of fast elements
2255   // to slow elements.
2256
2257   // Maximal gap that can be introduced by adding an element beyond
2258   // the current elements length.
2259   static const uint32_t kMaxGap = 1024;
2260
2261   // Maximal length of fast elements array that won't be checked for
2262   // being dense enough on expansion.
2263   static const int kMaxUncheckedFastElementsLength = 5000;
2264
2265   // Same as above but for old arrays. This limit is more strict. We
2266   // don't want to be wasteful with long lived objects.
2267   static const int kMaxUncheckedOldFastElementsLength = 500;
2268
2269   // Note that Page::kMaxRegularHeapObjectSize puts a limit on
2270   // permissible values (see the DCHECK in heap.cc).
2271   static const int kInitialMaxFastElementArray = 100000;
2272
2273   // This constant applies only to the initial map of "global.Object" and
2274   // not to arbitrary other JSObject maps.
2275   static const int kInitialGlobalObjectUnusedPropertiesCount = 4;
2276
2277   static const int kMaxInstanceSize = 255 * kPointerSize;
2278   // When extending the backing storage for property values, we increase
2279   // its size by more than the 1 entry necessary, so sequentially adding fields
2280   // to the same object requires fewer allocations and copies.
2281   static const int kFieldsAdded = 3;
2282
2283   // Layout description.
2284   static const int kPropertiesOffset = HeapObject::kHeaderSize;
2285   static const int kElementsOffset = kPropertiesOffset + kPointerSize;
2286   static const int kHeaderSize = kElementsOffset + kPointerSize;
2287
2288   STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize);
2289
2290   class BodyDescriptor : public FlexibleBodyDescriptor<kPropertiesOffset> {
2291    public:
2292     static inline int SizeOf(Map* map, HeapObject* object);
2293   };
2294
2295   Context* GetCreationContext();
2296
2297   // Enqueue change record for Object.observe. May cause GC.
2298   MUST_USE_RESULT static MaybeHandle<Object> EnqueueChangeRecord(
2299       Handle<JSObject> object, const char* type, Handle<Name> name,
2300       Handle<Object> old_value);
2301
2302   // Gets the number of currently used elements.
2303   int GetFastElementsUsage();
2304
2305   // Deletes an existing named property in a normalized object.
2306   static void DeleteNormalizedProperty(Handle<JSObject> object,
2307                                        Handle<Name> name, int entry);
2308
2309   static bool AllCanRead(LookupIterator* it);
2310   static bool AllCanWrite(LookupIterator* it);
2311
2312  private:
2313   friend class JSReceiver;
2314   friend class Object;
2315
2316   static void MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map);
2317   static void MigrateFastToSlow(Handle<JSObject> object,
2318                                 Handle<Map> new_map,
2319                                 int expected_additional_properties);
2320
2321   // Used from Object::GetProperty().
2322   MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithFailedAccessCheck(
2323       LookupIterator* it);
2324
2325   MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithFailedAccessCheck(
2326       LookupIterator* it, Handle<Object> value);
2327
2328   // Add a property to a slow-case object.
2329   static void AddSlowProperty(Handle<JSObject> object,
2330                               Handle<Name> name,
2331                               Handle<Object> value,
2332                               PropertyAttributes attributes);
2333
2334   MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyWithInterceptor(
2335       LookupIterator* it);
2336
2337   bool ReferencesObjectFromElements(FixedArray* elements,
2338                                     ElementsKind kind,
2339                                     Object* object);
2340
2341   // Return the hash table backing store or the inline stored identity hash,
2342   // whatever is found.
2343   MUST_USE_RESULT Object* GetHiddenPropertiesHashTable();
2344
2345   // Return the hash table backing store for hidden properties.  If there is no
2346   // backing store, allocate one.
2347   static Handle<ObjectHashTable> GetOrCreateHiddenPropertiesHashtable(
2348       Handle<JSObject> object);
2349
2350   // Set the hidden property backing store to either a hash table or
2351   // the inline-stored identity hash.
2352   static Handle<Object> SetHiddenPropertiesHashTable(
2353       Handle<JSObject> object,
2354       Handle<Object> value);
2355
2356   MUST_USE_RESULT Object* GetIdentityHash();
2357
2358   static Handle<Smi> GetOrCreateIdentityHash(Handle<JSObject> object);
2359
2360   static Handle<SeededNumberDictionary> GetNormalizedElementDictionary(
2361       Handle<JSObject> object, Handle<FixedArrayBase> elements);
2362
2363   // Helper for fast versions of preventExtensions, seal, and freeze.
2364   // attrs is one of NONE, SEALED, or FROZEN (depending on the operation).
2365   template <PropertyAttributes attrs>
2366   MUST_USE_RESULT static MaybeHandle<Object> PreventExtensionsWithTransition(
2367       Handle<JSObject> object);
2368
2369   DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject);
2370 };
2371
2372
2373 // Common superclass for FixedArrays that allow implementations to share
2374 // common accessors and some code paths.
2375 class FixedArrayBase: public HeapObject {
2376  public:
2377   // [length]: length of the array.
2378   inline int length() const;
2379   inline void set_length(int value);
2380
2381   // Get and set the length using acquire loads and release stores.
2382   inline int synchronized_length() const;
2383   inline void synchronized_set_length(int value);
2384
2385   DECLARE_CAST(FixedArrayBase)
2386
2387   // Layout description.
2388   // Length is smi tagged when it is stored.
2389   static const int kLengthOffset = HeapObject::kHeaderSize;
2390   static const int kHeaderSize = kLengthOffset + kPointerSize;
2391 };
2392
2393
2394 class FixedDoubleArray;
2395 class IncrementalMarking;
2396
2397
2398 // FixedArray describes fixed-sized arrays with element type Object*.
2399 class FixedArray: public FixedArrayBase {
2400  public:
2401   // Setter and getter for elements.
2402   inline Object* get(int index) const;
2403   static inline Handle<Object> get(Handle<FixedArray> array, int index);
2404   // Setter that uses write barrier.
2405   inline void set(int index, Object* value);
2406   inline bool is_the_hole(int index);
2407
2408   // Setter that doesn't need write barrier.
2409   inline void set(int index, Smi* value);
2410   // Setter with explicit barrier mode.
2411   inline void set(int index, Object* value, WriteBarrierMode mode);
2412
2413   // Setters for frequently used oddballs located in old space.
2414   inline void set_undefined(int index);
2415   inline void set_null(int index);
2416   inline void set_the_hole(int index);
2417
2418   inline Object** GetFirstElementAddress();
2419   inline bool ContainsOnlySmisOrHoles();
2420
2421   // Gives access to raw memory which stores the array's data.
2422   inline Object** data_start();
2423
2424   inline void FillWithHoles(int from, int to);
2425
2426   // Shrink length and insert filler objects.
2427   void Shrink(int length);
2428
2429   enum KeyFilter { ALL_KEYS, NON_SYMBOL_KEYS };
2430
2431   // Add the elements of a JSArray to this FixedArray.
2432   MUST_USE_RESULT static MaybeHandle<FixedArray> AddKeysFromArrayLike(
2433       Handle<FixedArray> content, Handle<JSObject> array,
2434       KeyFilter filter = ALL_KEYS);
2435
2436   // Computes the union of keys and return the result.
2437   // Used for implementing "for (n in object) { }"
2438   MUST_USE_RESULT static MaybeHandle<FixedArray> UnionOfKeys(
2439       Handle<FixedArray> first,
2440       Handle<FixedArray> second);
2441
2442   // Copy a sub array from the receiver to dest.
2443   void CopyTo(int pos, FixedArray* dest, int dest_pos, int len);
2444
2445   // Garbage collection support.
2446   static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; }
2447
2448   // Code Generation support.
2449   static int OffsetOfElementAt(int index) { return SizeFor(index); }
2450
2451   // Garbage collection support.
2452   inline Object** RawFieldOfElementAt(int index);
2453
2454   DECLARE_CAST(FixedArray)
2455
2456   // Maximal allowed size, in bytes, of a single FixedArray.
2457   // Prevents overflowing size computations, as well as extreme memory
2458   // consumption.
2459   static const int kMaxSize = 128 * MB * kPointerSize;
2460   // Maximally allowed length of a FixedArray.
2461   static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize;
2462
2463   // Dispatched behavior.
2464   DECLARE_PRINTER(FixedArray)
2465   DECLARE_VERIFIER(FixedArray)
2466 #ifdef DEBUG
2467   // Checks if two FixedArrays have identical contents.
2468   bool IsEqualTo(FixedArray* other);
2469 #endif
2470
2471   // Swap two elements in a pair of arrays.  If this array and the
2472   // numbers array are the same object, the elements are only swapped
2473   // once.
2474   void SwapPairs(FixedArray* numbers, int i, int j);
2475
2476   // Sort prefix of this array and the numbers array as pairs wrt. the
2477   // numbers.  If the numbers array and the this array are the same
2478   // object, the prefix of this array is sorted.
2479   void SortPairs(FixedArray* numbers, uint32_t len);
2480
2481   class BodyDescriptor : public FlexibleBodyDescriptor<kHeaderSize> {
2482    public:
2483     static inline int SizeOf(Map* map, HeapObject* object);
2484   };
2485
2486  protected:
2487   // Set operation on FixedArray without using write barriers. Can
2488   // only be used for storing old space objects or smis.
2489   static inline void NoWriteBarrierSet(FixedArray* array,
2490                                        int index,
2491                                        Object* value);
2492
2493   // Set operation on FixedArray without incremental write barrier. Can
2494   // only be used if the object is guaranteed to be white (whiteness witness
2495   // is present).
2496   static inline void NoIncrementalWriteBarrierSet(FixedArray* array,
2497                                                   int index,
2498                                                   Object* value);
2499
2500  private:
2501   STATIC_ASSERT(kHeaderSize == Internals::kFixedArrayHeaderSize);
2502
2503   DISALLOW_IMPLICIT_CONSTRUCTORS(FixedArray);
2504 };
2505
2506
2507 // FixedDoubleArray describes fixed-sized arrays with element type double.
2508 class FixedDoubleArray: public FixedArrayBase {
2509  public:
2510   // Setter and getter for elements.
2511   inline double get_scalar(int index);
2512   inline uint64_t get_representation(int index);
2513   static inline Handle<Object> get(Handle<FixedDoubleArray> array, int index);
2514   inline void set(int index, double value);
2515   inline void set_the_hole(int index);
2516
2517   // Checking for the hole.
2518   inline bool is_the_hole(int index);
2519
2520   // Garbage collection support.
2521   inline static int SizeFor(int length) {
2522     return kHeaderSize + length * kDoubleSize;
2523   }
2524
2525   // Gives access to raw memory which stores the array's data.
2526   inline double* data_start();
2527
2528   inline void FillWithHoles(int from, int to);
2529
2530   // Code Generation support.
2531   static int OffsetOfElementAt(int index) { return SizeFor(index); }
2532
2533   DECLARE_CAST(FixedDoubleArray)
2534
2535   // Maximal allowed size, in bytes, of a single FixedDoubleArray.
2536   // Prevents overflowing size computations, as well as extreme memory
2537   // consumption.
2538   static const int kMaxSize = 512 * MB;
2539   // Maximally allowed length of a FixedArray.
2540   static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize;
2541
2542   // Dispatched behavior.
2543   DECLARE_PRINTER(FixedDoubleArray)
2544   DECLARE_VERIFIER(FixedDoubleArray)
2545
2546  private:
2547   DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray);
2548 };
2549
2550
2551 class WeakFixedArray : public FixedArray {
2552  public:
2553   // If |maybe_array| is not a WeakFixedArray, a fresh one will be allocated.
2554   // This function does not check if the value exists already, callers must
2555   // ensure this themselves if necessary.
2556   static Handle<WeakFixedArray> Add(Handle<Object> maybe_array,
2557                                     Handle<HeapObject> value,
2558                                     int* assigned_index = NULL);
2559
2560   // Returns true if an entry was found and removed.
2561   bool Remove(Handle<HeapObject> value);
2562
2563   class NullCallback {
2564    public:
2565     static void Callback(Object* value, int old_index, int new_index) {}
2566   };
2567
2568   template <class CompactionCallback>
2569   void Compact();
2570
2571   inline Object* Get(int index) const;
2572   inline void Clear(int index);
2573   inline int Length() const;
2574
2575   inline bool IsEmptySlot(int index) const;
2576   static Object* Empty() { return Smi::FromInt(0); }
2577
2578   class Iterator {
2579    public:
2580     explicit Iterator(Object* maybe_array) : list_(NULL) { Reset(maybe_array); }
2581     void Reset(Object* maybe_array);
2582
2583     template <class T>
2584     inline T* Next();
2585
2586    private:
2587     int index_;
2588     WeakFixedArray* list_;
2589 #ifdef DEBUG
2590     int last_used_index_;
2591     DisallowHeapAllocation no_gc_;
2592 #endif  // DEBUG
2593     DISALLOW_COPY_AND_ASSIGN(Iterator);
2594   };
2595
2596   DECLARE_CAST(WeakFixedArray)
2597
2598  private:
2599   static const int kLastUsedIndexIndex = 0;
2600   static const int kFirstIndex = 1;
2601
2602   static Handle<WeakFixedArray> Allocate(
2603       Isolate* isolate, int size, Handle<WeakFixedArray> initialize_from);
2604
2605   static void Set(Handle<WeakFixedArray> array, int index,
2606                   Handle<HeapObject> value);
2607   inline void clear(int index);
2608
2609   inline int last_used_index() const;
2610   inline void set_last_used_index(int index);
2611
2612   // Disallow inherited setters.
2613   void set(int index, Smi* value);
2614   void set(int index, Object* value);
2615   void set(int index, Object* value, WriteBarrierMode mode);
2616   DISALLOW_IMPLICIT_CONSTRUCTORS(WeakFixedArray);
2617 };
2618
2619
2620 // Generic array grows dynamically with O(1) amortized insertion.
2621 class ArrayList : public FixedArray {
2622  public:
2623   enum AddMode {
2624     kNone,
2625     // Use this if GC can delete elements from the array.
2626     kReloadLengthAfterAllocation,
2627   };
2628   static Handle<ArrayList> Add(Handle<ArrayList> array, Handle<Object> obj,
2629                                AddMode mode = kNone);
2630   static Handle<ArrayList> Add(Handle<ArrayList> array, Handle<Object> obj1,
2631                                Handle<Object> obj2, AddMode = kNone);
2632   inline int Length();
2633   inline void SetLength(int length);
2634   inline Object* Get(int index);
2635   inline Object** Slot(int index);
2636   inline void Set(int index, Object* obj);
2637   inline void Clear(int index, Object* undefined);
2638   DECLARE_CAST(ArrayList)
2639
2640  private:
2641   static Handle<ArrayList> EnsureSpace(Handle<ArrayList> array, int length);
2642   static const int kLengthIndex = 0;
2643   static const int kFirstIndex = 1;
2644   DISALLOW_IMPLICIT_CONSTRUCTORS(ArrayList);
2645 };
2646
2647
2648 // DescriptorArrays are fixed arrays used to hold instance descriptors.
2649 // The format of the these objects is:
2650 //   [0]: Number of descriptors
2651 //   [1]: Either Smi(0) if uninitialized, or a pointer to small fixed array:
2652 //          [0]: pointer to fixed array with enum cache
2653 //          [1]: either Smi(0) or pointer to fixed array with indices
2654 //   [2]: first key
2655 //   [2 + number of descriptors * kDescriptorSize]: start of slack
2656 class DescriptorArray: public FixedArray {
2657  public:
2658   // Returns true for both shared empty_descriptor_array and for smis, which the
2659   // map uses to encode additional bit fields when the descriptor array is not
2660   // yet used.
2661   inline bool IsEmpty();
2662
2663   // Returns the number of descriptors in the array.
2664   inline int number_of_descriptors();
2665
2666   inline int number_of_descriptors_storage();
2667
2668   inline int NumberOfSlackDescriptors();
2669
2670   inline void SetNumberOfDescriptors(int number_of_descriptors);
2671   inline int number_of_entries();
2672
2673   inline bool HasEnumCache();
2674
2675   inline void CopyEnumCacheFrom(DescriptorArray* array);
2676
2677   inline FixedArray* GetEnumCache();
2678
2679   inline bool HasEnumIndicesCache();
2680
2681   inline FixedArray* GetEnumIndicesCache();
2682
2683   inline Object** GetEnumCacheSlot();
2684
2685   void ClearEnumCache();
2686
2687   // Initialize or change the enum cache,
2688   // using the supplied storage for the small "bridge".
2689   void SetEnumCache(FixedArray* bridge_storage,
2690                     FixedArray* new_cache,
2691                     Object* new_index_cache);
2692
2693   bool CanHoldValue(int descriptor, Object* value);
2694
2695   // Accessors for fetching instance descriptor at descriptor number.
2696   inline Name* GetKey(int descriptor_number);
2697   inline Object** GetKeySlot(int descriptor_number);
2698   inline Object* GetValue(int descriptor_number);
2699   inline void SetValue(int descriptor_number, Object* value);
2700   inline Object** GetValueSlot(int descriptor_number);
2701   static inline int GetValueOffset(int descriptor_number);
2702   inline Object** GetDescriptorStartSlot(int descriptor_number);
2703   inline Object** GetDescriptorEndSlot(int descriptor_number);
2704   inline PropertyDetails GetDetails(int descriptor_number);
2705   inline PropertyType GetType(int descriptor_number);
2706   inline int GetFieldIndex(int descriptor_number);
2707   inline HeapType* GetFieldType(int descriptor_number);
2708   inline Object* GetConstant(int descriptor_number);
2709   inline Object* GetCallbacksObject(int descriptor_number);
2710   inline AccessorDescriptor* GetCallbacks(int descriptor_number);
2711
2712   inline Name* GetSortedKey(int descriptor_number);
2713   inline int GetSortedKeyIndex(int descriptor_number);
2714   inline void SetSortedKey(int pointer, int descriptor_number);
2715   inline void SetRepresentation(int descriptor_number,
2716                                 Representation representation);
2717
2718   // Accessor for complete descriptor.
2719   inline void Get(int descriptor_number, Descriptor* desc);
2720   inline void Set(int descriptor_number, Descriptor* desc);
2721   void Replace(int descriptor_number, Descriptor* descriptor);
2722
2723   // Append automatically sets the enumeration index. This should only be used
2724   // to add descriptors in bulk at the end, followed by sorting the descriptor
2725   // array.
2726   inline void Append(Descriptor* desc);
2727
2728   static Handle<DescriptorArray> CopyUpTo(Handle<DescriptorArray> desc,
2729                                           int enumeration_index,
2730                                           int slack = 0);
2731
2732   static Handle<DescriptorArray> CopyUpToAddAttributes(
2733       Handle<DescriptorArray> desc,
2734       int enumeration_index,
2735       PropertyAttributes attributes,
2736       int slack = 0);
2737
2738   // Sort the instance descriptors by the hash codes of their keys.
2739   void Sort();
2740
2741   // Search the instance descriptors for given name.
2742   INLINE(int Search(Name* name, int number_of_own_descriptors));
2743
2744   // As the above, but uses DescriptorLookupCache and updates it when
2745   // necessary.
2746   INLINE(int SearchWithCache(Name* name, Map* map));
2747
2748   // Allocates a DescriptorArray, but returns the singleton
2749   // empty descriptor array object if number_of_descriptors is 0.
2750   static Handle<DescriptorArray> Allocate(Isolate* isolate,
2751                                           int number_of_descriptors,
2752                                           int slack = 0);
2753
2754   DECLARE_CAST(DescriptorArray)
2755
2756   // Constant for denoting key was not found.
2757   static const int kNotFound = -1;
2758
2759   static const int kDescriptorLengthIndex = 0;
2760   static const int kEnumCacheIndex = 1;
2761   static const int kFirstIndex = 2;
2762
2763   // The length of the "bridge" to the enum cache.
2764   static const int kEnumCacheBridgeLength = 2;
2765   static const int kEnumCacheBridgeCacheIndex = 0;
2766   static const int kEnumCacheBridgeIndicesCacheIndex = 1;
2767
2768   // Layout description.
2769   static const int kDescriptorLengthOffset = FixedArray::kHeaderSize;
2770   static const int kEnumCacheOffset = kDescriptorLengthOffset + kPointerSize;
2771   static const int kFirstOffset = kEnumCacheOffset + kPointerSize;
2772
2773   // Layout description for the bridge array.
2774   static const int kEnumCacheBridgeCacheOffset = FixedArray::kHeaderSize;
2775
2776   // Layout of descriptor.
2777   static const int kDescriptorKey = 0;
2778   static const int kDescriptorDetails = 1;
2779   static const int kDescriptorValue = 2;
2780   static const int kDescriptorSize = 3;
2781
2782 #if defined(DEBUG) || defined(OBJECT_PRINT)
2783   // For our gdb macros, we should perhaps change these in the future.
2784   void Print();
2785
2786   // Print all the descriptors.
2787   void PrintDescriptors(std::ostream& os);  // NOLINT
2788 #endif
2789
2790 #ifdef DEBUG
2791   // Is the descriptor array sorted and without duplicates?
2792   bool IsSortedNoDuplicates(int valid_descriptors = -1);
2793
2794   // Is the descriptor array consistent with the back pointers in targets?
2795   bool IsConsistentWithBackPointers(Map* current_map);
2796
2797   // Are two DescriptorArrays equal?
2798   bool IsEqualTo(DescriptorArray* other);
2799 #endif
2800
2801   // Returns the fixed array length required to hold number_of_descriptors
2802   // descriptors.
2803   static int LengthFor(int number_of_descriptors) {
2804     return ToKeyIndex(number_of_descriptors);
2805   }
2806
2807  private:
2808   // WhitenessWitness is used to prove that a descriptor array is white
2809   // (unmarked), so incremental write barriers can be skipped because the
2810   // marking invariant cannot be broken and slots pointing into evacuation
2811   // candidates will be discovered when the object is scanned. A witness is
2812   // always stack-allocated right after creating an array. By allocating a
2813   // witness, incremental marking is globally disabled. The witness is then
2814   // passed along wherever needed to statically prove that the array is known to
2815   // be white.
2816   class WhitenessWitness {
2817    public:
2818     inline explicit WhitenessWitness(DescriptorArray* array);
2819     inline ~WhitenessWitness();
2820
2821    private:
2822     IncrementalMarking* marking_;
2823   };
2824
2825   // An entry in a DescriptorArray, represented as an (array, index) pair.
2826   class Entry {
2827    public:
2828     inline explicit Entry(DescriptorArray* descs, int index) :
2829         descs_(descs), index_(index) { }
2830
2831     inline PropertyType type();
2832     inline Object* GetCallbackObject();
2833
2834    private:
2835     DescriptorArray* descs_;
2836     int index_;
2837   };
2838
2839   // Conversion from descriptor number to array indices.
2840   static int ToKeyIndex(int descriptor_number) {
2841     return kFirstIndex +
2842            (descriptor_number * kDescriptorSize) +
2843            kDescriptorKey;
2844   }
2845
2846   static int ToDetailsIndex(int descriptor_number) {
2847     return kFirstIndex +
2848            (descriptor_number * kDescriptorSize) +
2849            kDescriptorDetails;
2850   }
2851
2852   static int ToValueIndex(int descriptor_number) {
2853     return kFirstIndex +
2854            (descriptor_number * kDescriptorSize) +
2855            kDescriptorValue;
2856   }
2857
2858   // Transfer a complete descriptor from the src descriptor array to this
2859   // descriptor array.
2860   void CopyFrom(int index, DescriptorArray* src, const WhitenessWitness&);
2861
2862   inline void Set(int descriptor_number,
2863                   Descriptor* desc,
2864                   const WhitenessWitness&);
2865
2866   // Swap first and second descriptor.
2867   inline void SwapSortedKeys(int first, int second);
2868
2869   DISALLOW_IMPLICIT_CONSTRUCTORS(DescriptorArray);
2870 };
2871
2872
2873 enum SearchMode { ALL_ENTRIES, VALID_ENTRIES };
2874
2875 template <SearchMode search_mode, typename T>
2876 inline int Search(T* array, Name* name, int valid_entries = 0,
2877                   int* out_insertion_index = NULL);
2878
2879
2880 // HashTable is a subclass of FixedArray that implements a hash table
2881 // that uses open addressing and quadratic probing.
2882 //
2883 // In order for the quadratic probing to work, elements that have not
2884 // yet been used and elements that have been deleted are
2885 // distinguished.  Probing continues when deleted elements are
2886 // encountered and stops when unused elements are encountered.
2887 //
2888 // - Elements with key == undefined have not been used yet.
2889 // - Elements with key == the_hole have been deleted.
2890 //
2891 // The hash table class is parameterized with a Shape and a Key.
2892 // Shape must be a class with the following interface:
2893 //   class ExampleShape {
2894 //    public:
2895 //      // Tells whether key matches other.
2896 //     static bool IsMatch(Key key, Object* other);
2897 //     // Returns the hash value for key.
2898 //     static uint32_t Hash(Key key);
2899 //     // Returns the hash value for object.
2900 //     static uint32_t HashForObject(Key key, Object* object);
2901 //     // Convert key to an object.
2902 //     static inline Handle<Object> AsHandle(Isolate* isolate, Key key);
2903 //     // The prefix size indicates number of elements in the beginning
2904 //     // of the backing storage.
2905 //     static const int kPrefixSize = ..;
2906 //     // The Element size indicates number of elements per entry.
2907 //     static const int kEntrySize = ..;
2908 //   };
2909 // The prefix size indicates an amount of memory in the
2910 // beginning of the backing storage that can be used for non-element
2911 // information by subclasses.
2912
2913 template<typename Key>
2914 class BaseShape {
2915  public:
2916   static const bool UsesSeed = false;
2917   static uint32_t Hash(Key key) { return 0; }
2918   static uint32_t SeededHash(Key key, uint32_t seed) {
2919     DCHECK(UsesSeed);
2920     return Hash(key);
2921   }
2922   static uint32_t HashForObject(Key key, Object* object) { return 0; }
2923   static uint32_t SeededHashForObject(Key key, uint32_t seed, Object* object) {
2924     DCHECK(UsesSeed);
2925     return HashForObject(key, object);
2926   }
2927 };
2928
2929
2930 class HashTableBase : public FixedArray {
2931  public:
2932   // Returns the number of elements in the hash table.
2933   inline int NumberOfElements();
2934
2935   // Returns the number of deleted elements in the hash table.
2936   inline int NumberOfDeletedElements();
2937
2938   // Returns the capacity of the hash table.
2939   inline int Capacity();
2940
2941   // ElementAdded should be called whenever an element is added to a
2942   // hash table.
2943   inline void ElementAdded();
2944
2945   // ElementRemoved should be called whenever an element is removed from
2946   // a hash table.
2947   inline void ElementRemoved();
2948   inline void ElementsRemoved(int n);
2949
2950   // Computes the required capacity for a table holding the given
2951   // number of elements. May be more than HashTable::kMaxCapacity.
2952   static inline int ComputeCapacity(int at_least_space_for);
2953
2954   // Tells whether k is a real key.  The hole and undefined are not allowed
2955   // as keys and can be used to indicate missing or deleted elements.
2956   inline bool IsKey(Object* k);
2957
2958   // Compute the probe offset (quadratic probing).
2959   INLINE(static uint32_t GetProbeOffset(uint32_t n)) {
2960     return (n + n * n) >> 1;
2961   }
2962
2963   static const int kNumberOfElementsIndex = 0;
2964   static const int kNumberOfDeletedElementsIndex = 1;
2965   static const int kCapacityIndex = 2;
2966   static const int kPrefixStartIndex = 3;
2967
2968   // Constant used for denoting a absent entry.
2969   static const int kNotFound = -1;
2970
2971  protected:
2972   // Update the number of elements in the hash table.
2973   inline void SetNumberOfElements(int nof);
2974
2975   // Update the number of deleted elements in the hash table.
2976   inline void SetNumberOfDeletedElements(int nod);
2977
2978   // Returns probe entry.
2979   static uint32_t GetProbe(uint32_t hash, uint32_t number, uint32_t size) {
2980     DCHECK(base::bits::IsPowerOfTwo32(size));
2981     return (hash + GetProbeOffset(number)) & (size - 1);
2982   }
2983
2984   inline static uint32_t FirstProbe(uint32_t hash, uint32_t size) {
2985     return hash & (size - 1);
2986   }
2987
2988   inline static uint32_t NextProbe(
2989       uint32_t last, uint32_t number, uint32_t size) {
2990     return (last + number) & (size - 1);
2991   }
2992 };
2993
2994
2995 template <typename Derived, typename Shape, typename Key>
2996 class HashTable : public HashTableBase {
2997  public:
2998   // Wrapper methods
2999   inline uint32_t Hash(Key key) {
3000     if (Shape::UsesSeed) {
3001       return Shape::SeededHash(key, GetHeap()->HashSeed());
3002     } else {
3003       return Shape::Hash(key);
3004     }
3005   }
3006
3007   inline uint32_t HashForObject(Key key, Object* object) {
3008     if (Shape::UsesSeed) {
3009       return Shape::SeededHashForObject(key, GetHeap()->HashSeed(), object);
3010     } else {
3011       return Shape::HashForObject(key, object);
3012     }
3013   }
3014
3015   // Returns a new HashTable object.
3016   MUST_USE_RESULT static Handle<Derived> New(
3017       Isolate* isolate, int at_least_space_for,
3018       MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY,
3019       PretenureFlag pretenure = NOT_TENURED);
3020
3021   DECLARE_CAST(HashTable)
3022
3023   // Garbage collection support.
3024   void IteratePrefix(ObjectVisitor* visitor);
3025   void IterateElements(ObjectVisitor* visitor);
3026
3027   // Find entry for key otherwise return kNotFound.
3028   inline int FindEntry(Key key);
3029   inline int FindEntry(Isolate* isolate, Key key, int32_t hash);
3030   int FindEntry(Isolate* isolate, Key key);
3031
3032   // Rehashes the table in-place.
3033   void Rehash(Key key);
3034
3035   // Returns the key at entry.
3036   Object* KeyAt(int entry) { return get(EntryToIndex(entry)); }
3037
3038   static const int kElementsStartIndex = kPrefixStartIndex + Shape::kPrefixSize;
3039   static const int kEntrySize = Shape::kEntrySize;
3040   static const int kElementsStartOffset =
3041       kHeaderSize + kElementsStartIndex * kPointerSize;
3042   static const int kCapacityOffset =
3043       kHeaderSize + kCapacityIndex * kPointerSize;
3044
3045   // Returns the index for an entry (of the key)
3046   static inline int EntryToIndex(int entry) {
3047     return (entry * kEntrySize) + kElementsStartIndex;
3048   }
3049
3050  protected:
3051   friend class ObjectHashTable;
3052
3053   // Find the entry at which to insert element with the given key that
3054   // has the given hash value.
3055   uint32_t FindInsertionEntry(uint32_t hash);
3056
3057   // Attempt to shrink hash table after removal of key.
3058   MUST_USE_RESULT static Handle<Derived> Shrink(Handle<Derived> table, Key key);
3059
3060   // Ensure enough space for n additional elements.
3061   MUST_USE_RESULT static Handle<Derived> EnsureCapacity(
3062       Handle<Derived> table,
3063       int n,
3064       Key key,
3065       PretenureFlag pretenure = NOT_TENURED);
3066
3067   // Sets the capacity of the hash table.
3068   void SetCapacity(int capacity) {
3069     // To scale a computed hash code to fit within the hash table, we
3070     // use bit-wise AND with a mask, so the capacity must be positive
3071     // and non-zero.
3072     DCHECK(capacity > 0);
3073     DCHECK(capacity <= kMaxCapacity);
3074     set(kCapacityIndex, Smi::FromInt(capacity));
3075   }
3076
3077   // Maximal capacity of HashTable. Based on maximal length of underlying
3078   // FixedArray. Staying below kMaxCapacity also ensures that EntryToIndex
3079   // cannot overflow.
3080   static const int kMaxCapacity =
3081       (FixedArray::kMaxLength - kElementsStartOffset) / kEntrySize;
3082
3083  private:
3084   // Returns _expected_ if one of entries given by the first _probe_ probes is
3085   // equal to  _expected_. Otherwise, returns the entry given by the probe
3086   // number _probe_.
3087   uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected);
3088
3089   void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode);
3090
3091   // Rehashes this hash-table into the new table.
3092   void Rehash(Handle<Derived> new_table, Key key);
3093 };
3094
3095
3096 // HashTableKey is an abstract superclass for virtual key behavior.
3097 class HashTableKey {
3098  public:
3099   // Returns whether the other object matches this key.
3100   virtual bool IsMatch(Object* other) = 0;
3101   // Returns the hash value for this key.
3102   virtual uint32_t Hash() = 0;
3103   // Returns the hash value for object.
3104   virtual uint32_t HashForObject(Object* key) = 0;
3105   // Returns the key object for storing into the hash table.
3106   MUST_USE_RESULT virtual Handle<Object> AsHandle(Isolate* isolate) = 0;
3107   // Required.
3108   virtual ~HashTableKey() {}
3109 };
3110
3111
3112 class StringTableShape : public BaseShape<HashTableKey*> {
3113  public:
3114   static inline bool IsMatch(HashTableKey* key, Object* value) {
3115     return key->IsMatch(value);
3116   }
3117
3118   static inline uint32_t Hash(HashTableKey* key) {
3119     return key->Hash();
3120   }
3121
3122   static inline uint32_t HashForObject(HashTableKey* key, Object* object) {
3123     return key->HashForObject(object);
3124   }
3125
3126   static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key);
3127
3128   static const int kPrefixSize = 0;
3129   static const int kEntrySize = 1;
3130 };
3131
3132 class SeqOneByteString;
3133
3134 // StringTable.
3135 //
3136 // No special elements in the prefix and the element size is 1
3137 // because only the string itself (the key) needs to be stored.
3138 class StringTable: public HashTable<StringTable,
3139                                     StringTableShape,
3140                                     HashTableKey*> {
3141  public:
3142   // Find string in the string table. If it is not there yet, it is
3143   // added. The return value is the string found.
3144   static Handle<String> LookupString(Isolate* isolate, Handle<String> key);
3145   static Handle<String> LookupKey(Isolate* isolate, HashTableKey* key);
3146   static String* LookupKeyIfExists(Isolate* isolate, HashTableKey* key);
3147
3148   // Tries to internalize given string and returns string handle on success
3149   // or an empty handle otherwise.
3150   MUST_USE_RESULT static MaybeHandle<String> InternalizeStringIfExists(
3151       Isolate* isolate,
3152       Handle<String> string);
3153
3154   // Looks up a string that is equal to the given string and returns
3155   // string handle if it is found, or an empty handle otherwise.
3156   MUST_USE_RESULT static MaybeHandle<String> LookupStringIfExists(
3157       Isolate* isolate,
3158       Handle<String> str);
3159   MUST_USE_RESULT static MaybeHandle<String> LookupTwoCharsStringIfExists(
3160       Isolate* isolate,
3161       uint16_t c1,
3162       uint16_t c2);
3163
3164   static void EnsureCapacityForDeserialization(Isolate* isolate, int expected);
3165
3166   DECLARE_CAST(StringTable)
3167
3168  private:
3169   template <bool seq_one_byte>
3170   friend class JsonParser;
3171
3172   DISALLOW_IMPLICIT_CONSTRUCTORS(StringTable);
3173 };
3174
3175
3176 template <typename Derived, typename Shape, typename Key>
3177 class Dictionary: public HashTable<Derived, Shape, Key> {
3178   typedef HashTable<Derived, Shape, Key> DerivedHashTable;
3179
3180  public:
3181   // Returns the value at entry.
3182   Object* ValueAt(int entry) {
3183     return this->get(Derived::EntryToIndex(entry) + 1);
3184   }
3185
3186   // Set the value for entry.
3187   void ValueAtPut(int entry, Object* value) {
3188     this->set(Derived::EntryToIndex(entry) + 1, value);
3189   }
3190
3191   // Returns the property details for the property at entry.
3192   PropertyDetails DetailsAt(int entry) {
3193     return Shape::DetailsAt(static_cast<Derived*>(this), entry);
3194   }
3195
3196   // Set the details for entry.
3197   void DetailsAtPut(int entry, PropertyDetails value) {
3198     Shape::DetailsAtPut(static_cast<Derived*>(this), entry, value);
3199   }
3200
3201   // Returns true if property at given entry is deleted.
3202   bool IsDeleted(int entry) {
3203     return Shape::IsDeleted(static_cast<Derived*>(this), entry);
3204   }
3205
3206   // Delete a property from the dictionary.
3207   static Handle<Object> DeleteProperty(Handle<Derived> dictionary, int entry);
3208
3209   // Attempt to shrink the dictionary after deletion of key.
3210   MUST_USE_RESULT static inline Handle<Derived> Shrink(
3211       Handle<Derived> dictionary,
3212       Key key) {
3213     return DerivedHashTable::Shrink(dictionary, key);
3214   }
3215
3216   // Sorting support
3217   // TODO(dcarney): templatize or move to SeededNumberDictionary
3218   void CopyValuesTo(FixedArray* elements);
3219
3220   // Returns the number of elements in the dictionary filtering out properties
3221   // with the specified attributes.
3222   int NumberOfElementsFilterAttributes(PropertyAttributes filter);
3223
3224   // Returns the number of enumerable elements in the dictionary.
3225   int NumberOfEnumElements() {
3226     return NumberOfElementsFilterAttributes(
3227         static_cast<PropertyAttributes>(DONT_ENUM | SYMBOLIC));
3228   }
3229
3230   // Returns true if the dictionary contains any elements that are non-writable,
3231   // non-configurable, non-enumerable, or have getters/setters.
3232   bool HasComplexElements();
3233
3234   enum SortMode { UNSORTED, SORTED };
3235
3236   // Fill in details for properties into storage.
3237   // Returns the number of properties added.
3238   int CopyKeysTo(FixedArray* storage, int index, PropertyAttributes filter,
3239                  SortMode sort_mode);
3240
3241   // Copies enumerable keys to preallocated fixed array.
3242   void CopyEnumKeysTo(FixedArray* storage);
3243
3244   // Accessors for next enumeration index.
3245   void SetNextEnumerationIndex(int index) {
3246     DCHECK(index != 0);
3247     this->set(kNextEnumerationIndexIndex, Smi::FromInt(index));
3248   }
3249
3250   int NextEnumerationIndex() {
3251     return Smi::cast(this->get(kNextEnumerationIndexIndex))->value();
3252   }
3253
3254   // Creates a new dictionary.
3255   MUST_USE_RESULT static Handle<Derived> New(
3256       Isolate* isolate,
3257       int at_least_space_for,
3258       PretenureFlag pretenure = NOT_TENURED);
3259
3260   // Ensure enough space for n additional elements.
3261   static Handle<Derived> EnsureCapacity(Handle<Derived> obj, int n, Key key);
3262
3263 #ifdef OBJECT_PRINT
3264   void Print(std::ostream& os);  // NOLINT
3265 #endif
3266   // Returns the key (slow).
3267   Object* SlowReverseLookup(Object* value);
3268
3269   // Sets the entry to (key, value) pair.
3270   inline void SetEntry(int entry,
3271                        Handle<Object> key,
3272                        Handle<Object> value);
3273   inline void SetEntry(int entry,
3274                        Handle<Object> key,
3275                        Handle<Object> value,
3276                        PropertyDetails details);
3277
3278   MUST_USE_RESULT static Handle<Derived> Add(
3279       Handle<Derived> dictionary,
3280       Key key,
3281       Handle<Object> value,
3282       PropertyDetails details);
3283
3284   // Returns iteration indices array for the |dictionary|.
3285   // Values are direct indices in the |HashTable| array.
3286   static Handle<FixedArray> BuildIterationIndicesArray(
3287       Handle<Derived> dictionary);
3288
3289  protected:
3290   // Generic at put operation.
3291   MUST_USE_RESULT static Handle<Derived> AtPut(
3292       Handle<Derived> dictionary,
3293       Key key,
3294       Handle<Object> value);
3295
3296   // Add entry to dictionary.
3297   static void AddEntry(
3298       Handle<Derived> dictionary,
3299       Key key,
3300       Handle<Object> value,
3301       PropertyDetails details,
3302       uint32_t hash);
3303
3304   // Generate new enumeration indices to avoid enumeration index overflow.
3305   // Returns iteration indices array for the |dictionary|.
3306   static Handle<FixedArray> GenerateNewEnumerationIndices(
3307       Handle<Derived> dictionary);
3308   static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex;
3309   static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1;
3310 };
3311
3312
3313 template <typename Derived, typename Shape>
3314 class NameDictionaryBase : public Dictionary<Derived, Shape, Handle<Name> > {
3315   typedef Dictionary<Derived, Shape, Handle<Name> > DerivedDictionary;
3316
3317  public:
3318   // Find entry for key, otherwise return kNotFound. Optimized version of
3319   // HashTable::FindEntry.
3320   int FindEntry(Handle<Name> key);
3321 };
3322
3323
3324 template <typename Key>
3325 class BaseDictionaryShape : public BaseShape<Key> {
3326  public:
3327   template <typename Dictionary>
3328   static inline PropertyDetails DetailsAt(Dictionary* dict, int entry) {
3329     STATIC_ASSERT(Dictionary::kEntrySize == 3);
3330     DCHECK(entry >= 0);  // Not found is -1, which is not caught by get().
3331     return PropertyDetails(
3332         Smi::cast(dict->get(Dictionary::EntryToIndex(entry) + 2)));
3333   }
3334
3335   template <typename Dictionary>
3336   static inline void DetailsAtPut(Dictionary* dict, int entry,
3337                                   PropertyDetails value) {
3338     STATIC_ASSERT(Dictionary::kEntrySize == 3);
3339     dict->set(Dictionary::EntryToIndex(entry) + 2, value.AsSmi());
3340   }
3341
3342   template <typename Dictionary>
3343   static bool IsDeleted(Dictionary* dict, int entry) {
3344     return false;
3345   }
3346
3347   template <typename Dictionary>
3348   static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key,
3349                               Handle<Object> value, PropertyDetails details);
3350 };
3351
3352
3353 class NameDictionaryShape : public BaseDictionaryShape<Handle<Name> > {
3354  public:
3355   static inline bool IsMatch(Handle<Name> key, Object* other);
3356   static inline uint32_t Hash(Handle<Name> key);
3357   static inline uint32_t HashForObject(Handle<Name> key, Object* object);
3358   static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Name> key);
3359   static const int kPrefixSize = 2;
3360   static const int kEntrySize = 3;
3361   static const bool kIsEnumerable = true;
3362 };
3363
3364
3365 class NameDictionary
3366     : public NameDictionaryBase<NameDictionary, NameDictionaryShape> {
3367   typedef NameDictionaryBase<NameDictionary, NameDictionaryShape>
3368       DerivedDictionary;
3369
3370  public:
3371   DECLARE_CAST(NameDictionary)
3372
3373   inline static Handle<FixedArray> DoGenerateNewEnumerationIndices(
3374       Handle<NameDictionary> dictionary);
3375 };
3376
3377
3378 class GlobalDictionaryShape : public NameDictionaryShape {
3379  public:
3380   static const int kEntrySize = 2;  // Overrides NameDictionaryShape::kEntrySize
3381
3382   template <typename Dictionary>
3383   static inline PropertyDetails DetailsAt(Dictionary* dict, int entry);
3384
3385   template <typename Dictionary>
3386   static inline void DetailsAtPut(Dictionary* dict, int entry,
3387                                   PropertyDetails value);
3388
3389   template <typename Dictionary>
3390   static bool IsDeleted(Dictionary* dict, int entry);
3391
3392   template <typename Dictionary>
3393   static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key,
3394                               Handle<Object> value, PropertyDetails details);
3395 };
3396
3397
3398 class GlobalDictionary
3399     : public NameDictionaryBase<GlobalDictionary, GlobalDictionaryShape> {
3400  public:
3401   DECLARE_CAST(GlobalDictionary)
3402 };
3403
3404
3405 class NumberDictionaryShape : public BaseDictionaryShape<uint32_t> {
3406  public:
3407   static inline bool IsMatch(uint32_t key, Object* other);
3408   static inline Handle<Object> AsHandle(Isolate* isolate, uint32_t key);
3409   static const int kEntrySize = 3;
3410   static const bool kIsEnumerable = false;
3411 };
3412
3413
3414 class SeededNumberDictionaryShape : public NumberDictionaryShape {
3415  public:
3416   static const bool UsesSeed = true;
3417   static const int kPrefixSize = 2;
3418
3419   static inline uint32_t SeededHash(uint32_t key, uint32_t seed);
3420   static inline uint32_t SeededHashForObject(uint32_t key,
3421                                              uint32_t seed,
3422                                              Object* object);
3423 };
3424
3425
3426 class UnseededNumberDictionaryShape : public NumberDictionaryShape {
3427  public:
3428   static const int kPrefixSize = 0;
3429
3430   static inline uint32_t Hash(uint32_t key);
3431   static inline uint32_t HashForObject(uint32_t key, Object* object);
3432 };
3433
3434
3435 class SeededNumberDictionary
3436     : public Dictionary<SeededNumberDictionary,
3437                         SeededNumberDictionaryShape,
3438                         uint32_t> {
3439  public:
3440   DECLARE_CAST(SeededNumberDictionary)
3441
3442   // Type specific at put (default NONE attributes is used when adding).
3443   MUST_USE_RESULT static Handle<SeededNumberDictionary> AtNumberPut(
3444       Handle<SeededNumberDictionary> dictionary, uint32_t key,
3445       Handle<Object> value, bool used_as_prototype);
3446   MUST_USE_RESULT static Handle<SeededNumberDictionary> AddNumberEntry(
3447       Handle<SeededNumberDictionary> dictionary, uint32_t key,
3448       Handle<Object> value, PropertyDetails details, bool used_as_prototype);
3449
3450   // Set an existing entry or add a new one if needed.
3451   // Return the updated dictionary.
3452   MUST_USE_RESULT static Handle<SeededNumberDictionary> Set(
3453       Handle<SeededNumberDictionary> dictionary, uint32_t key,
3454       Handle<Object> value, PropertyDetails details, bool used_as_prototype);
3455
3456   void UpdateMaxNumberKey(uint32_t key, bool used_as_prototype);
3457
3458   // If slow elements are required we will never go back to fast-case
3459   // for the elements kept in this dictionary.  We require slow
3460   // elements if an element has been added at an index larger than
3461   // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called
3462   // when defining a getter or setter with a number key.
3463   inline bool requires_slow_elements();
3464   inline void set_requires_slow_elements();
3465
3466   // Get the value of the max number key that has been added to this
3467   // dictionary.  max_number_key can only be called if
3468   // requires_slow_elements returns false.
3469   inline uint32_t max_number_key();
3470
3471   // Bit masks.
3472   static const int kRequiresSlowElementsMask = 1;
3473   static const int kRequiresSlowElementsTagSize = 1;
3474   static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1;
3475 };
3476
3477
3478 class UnseededNumberDictionary
3479     : public Dictionary<UnseededNumberDictionary,
3480                         UnseededNumberDictionaryShape,
3481                         uint32_t> {
3482  public:
3483   DECLARE_CAST(UnseededNumberDictionary)
3484
3485   // Type specific at put (default NONE attributes is used when adding).
3486   MUST_USE_RESULT static Handle<UnseededNumberDictionary> AtNumberPut(
3487       Handle<UnseededNumberDictionary> dictionary,
3488       uint32_t key,
3489       Handle<Object> value);
3490   MUST_USE_RESULT static Handle<UnseededNumberDictionary> AddNumberEntry(
3491       Handle<UnseededNumberDictionary> dictionary,
3492       uint32_t key,
3493       Handle<Object> value);
3494
3495   // Set an existing entry or add a new one if needed.
3496   // Return the updated dictionary.
3497   MUST_USE_RESULT static Handle<UnseededNumberDictionary> Set(
3498       Handle<UnseededNumberDictionary> dictionary,
3499       uint32_t key,
3500       Handle<Object> value);
3501 };
3502
3503
3504 class ObjectHashTableShape : public BaseShape<Handle<Object> > {
3505  public:
3506   static inline bool IsMatch(Handle<Object> key, Object* other);
3507   static inline uint32_t Hash(Handle<Object> key);
3508   static inline uint32_t HashForObject(Handle<Object> key, Object* object);
3509   static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key);
3510   static const int kPrefixSize = 0;
3511   static const int kEntrySize = 2;
3512 };
3513
3514
3515 // ObjectHashTable maps keys that are arbitrary objects to object values by
3516 // using the identity hash of the key for hashing purposes.
3517 class ObjectHashTable: public HashTable<ObjectHashTable,
3518                                         ObjectHashTableShape,
3519                                         Handle<Object> > {
3520   typedef HashTable<
3521       ObjectHashTable, ObjectHashTableShape, Handle<Object> > DerivedHashTable;
3522  public:
3523   DECLARE_CAST(ObjectHashTable)
3524
3525   // Attempt to shrink hash table after removal of key.
3526   MUST_USE_RESULT static inline Handle<ObjectHashTable> Shrink(
3527       Handle<ObjectHashTable> table,
3528       Handle<Object> key);
3529
3530   // Looks up the value associated with the given key. The hole value is
3531   // returned in case the key is not present.
3532   Object* Lookup(Handle<Object> key);
3533   Object* Lookup(Handle<Object> key, int32_t hash);
3534   Object* Lookup(Isolate* isolate, Handle<Object> key, int32_t hash);
3535
3536   // Adds (or overwrites) the value associated with the given key.
3537   static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table,
3538                                      Handle<Object> key,
3539                                      Handle<Object> value);
3540   static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table,
3541                                      Handle<Object> key, Handle<Object> value,
3542                                      int32_t hash);
3543
3544   // Returns an ObjectHashTable (possibly |table|) where |key| has been removed.
3545   static Handle<ObjectHashTable> Remove(Handle<ObjectHashTable> table,
3546                                         Handle<Object> key,
3547                                         bool* was_present);
3548   static Handle<ObjectHashTable> Remove(Handle<ObjectHashTable> table,
3549                                         Handle<Object> key, bool* was_present,
3550                                         int32_t hash);
3551
3552  protected:
3553   friend class MarkCompactCollector;
3554
3555   void AddEntry(int entry, Object* key, Object* value);
3556   void RemoveEntry(int entry);
3557
3558   // Returns the index to the value of an entry.
3559   static inline int EntryToValueIndex(int entry) {
3560     return EntryToIndex(entry) + 1;
3561   }
3562 };
3563
3564
3565 // OrderedHashTable is a HashTable with Object keys that preserves
3566 // insertion order. There are Map and Set interfaces (OrderedHashMap
3567 // and OrderedHashTable, below). It is meant to be used by JSMap/JSSet.
3568 //
3569 // Only Object* keys are supported, with Object::SameValueZero() used as the
3570 // equality operator and Object::GetHash() for the hash function.
3571 //
3572 // Based on the "Deterministic Hash Table" as described by Jason Orendorff at
3573 // https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables
3574 // Originally attributed to Tyler Close.
3575 //
3576 // Memory layout:
3577 //   [0]: bucket count
3578 //   [1]: element count
3579 //   [2]: deleted element count
3580 //   [3..(3 + NumberOfBuckets() - 1)]: "hash table", where each item is an
3581 //                            offset into the data table (see below) where the
3582 //                            first item in this bucket is stored.
3583 //   [3 + NumberOfBuckets()..length]: "data table", an array of length
3584 //                            Capacity() * kEntrySize, where the first entrysize
3585 //                            items are handled by the derived class and the
3586 //                            item at kChainOffset is another entry into the
3587 //                            data table indicating the next entry in this hash
3588 //                            bucket.
3589 //
3590 // When we transition the table to a new version we obsolete it and reuse parts
3591 // of the memory to store information how to transition an iterator to the new
3592 // table:
3593 //
3594 // Memory layout for obsolete table:
3595 //   [0]: bucket count
3596 //   [1]: Next newer table
3597 //   [2]: Number of removed holes or -1 when the table was cleared.
3598 //   [3..(3 + NumberOfRemovedHoles() - 1)]: The indexes of the removed holes.
3599 //   [3 + NumberOfRemovedHoles()..length]: Not used
3600 //
3601 template<class Derived, class Iterator, int entrysize>
3602 class OrderedHashTable: public FixedArray {
3603  public:
3604   // Returns an OrderedHashTable with a capacity of at least |capacity|.
3605   static Handle<Derived> Allocate(
3606       Isolate* isolate, int capacity, PretenureFlag pretenure = NOT_TENURED);
3607
3608   // Returns an OrderedHashTable (possibly |table|) with enough space
3609   // to add at least one new element.
3610   static Handle<Derived> EnsureGrowable(Handle<Derived> table);
3611
3612   // Returns an OrderedHashTable (possibly |table|) that's shrunken
3613   // if possible.
3614   static Handle<Derived> Shrink(Handle<Derived> table);
3615
3616   // Returns a new empty OrderedHashTable and records the clearing so that
3617   // exisiting iterators can be updated.
3618   static Handle<Derived> Clear(Handle<Derived> table);
3619
3620   int NumberOfElements() {
3621     return Smi::cast(get(kNumberOfElementsIndex))->value();
3622   }
3623
3624   int NumberOfDeletedElements() {
3625     return Smi::cast(get(kNumberOfDeletedElementsIndex))->value();
3626   }
3627
3628   int UsedCapacity() { return NumberOfElements() + NumberOfDeletedElements(); }
3629
3630   int NumberOfBuckets() {
3631     return Smi::cast(get(kNumberOfBucketsIndex))->value();
3632   }
3633
3634   // Returns an index into |this| for the given entry.
3635   int EntryToIndex(int entry) {
3636     return kHashTableStartIndex + NumberOfBuckets() + (entry * kEntrySize);
3637   }
3638
3639   Object* KeyAt(int entry) { return get(EntryToIndex(entry)); }
3640
3641   bool IsObsolete() {
3642     return !get(kNextTableIndex)->IsSmi();
3643   }
3644
3645   // The next newer table. This is only valid if the table is obsolete.
3646   Derived* NextTable() {
3647     return Derived::cast(get(kNextTableIndex));
3648   }
3649
3650   // When the table is obsolete we store the indexes of the removed holes.
3651   int RemovedIndexAt(int index) {
3652     return Smi::cast(get(kRemovedHolesIndex + index))->value();
3653   }
3654
3655   static const int kNotFound = -1;
3656   static const int kMinCapacity = 4;
3657
3658   static const int kNumberOfBucketsIndex = 0;
3659   static const int kNumberOfElementsIndex = kNumberOfBucketsIndex + 1;
3660   static const int kNumberOfDeletedElementsIndex = kNumberOfElementsIndex + 1;
3661   static const int kHashTableStartIndex = kNumberOfDeletedElementsIndex + 1;
3662   static const int kNextTableIndex = kNumberOfElementsIndex;
3663
3664   static const int kNumberOfBucketsOffset =
3665       kHeaderSize + kNumberOfBucketsIndex * kPointerSize;
3666   static const int kNumberOfElementsOffset =
3667       kHeaderSize + kNumberOfElementsIndex * kPointerSize;
3668   static const int kNumberOfDeletedElementsOffset =
3669       kHeaderSize + kNumberOfDeletedElementsIndex * kPointerSize;
3670   static const int kHashTableStartOffset =
3671       kHeaderSize + kHashTableStartIndex * kPointerSize;
3672   static const int kNextTableOffset =
3673       kHeaderSize + kNextTableIndex * kPointerSize;
3674
3675   static const int kEntrySize = entrysize + 1;
3676   static const int kChainOffset = entrysize;
3677
3678   static const int kLoadFactor = 2;
3679
3680   // NumberOfDeletedElements is set to kClearedTableSentinel when
3681   // the table is cleared, which allows iterator transitions to
3682   // optimize that case.
3683   static const int kClearedTableSentinel = -1;
3684
3685  private:
3686   static Handle<Derived> Rehash(Handle<Derived> table, int new_capacity);
3687
3688   void SetNumberOfBuckets(int num) {
3689     set(kNumberOfBucketsIndex, Smi::FromInt(num));
3690   }
3691
3692   void SetNumberOfElements(int num) {
3693     set(kNumberOfElementsIndex, Smi::FromInt(num));
3694   }
3695
3696   void SetNumberOfDeletedElements(int num) {
3697     set(kNumberOfDeletedElementsIndex, Smi::FromInt(num));
3698   }
3699
3700   int Capacity() {
3701     return NumberOfBuckets() * kLoadFactor;
3702   }
3703
3704   void SetNextTable(Derived* next_table) {
3705     set(kNextTableIndex, next_table);
3706   }
3707
3708   void SetRemovedIndexAt(int index, int removed_index) {
3709     return set(kRemovedHolesIndex + index, Smi::FromInt(removed_index));
3710   }
3711
3712   static const int kRemovedHolesIndex = kHashTableStartIndex;
3713
3714   static const int kMaxCapacity =
3715       (FixedArray::kMaxLength - kHashTableStartIndex)
3716       / (1 + (kEntrySize * kLoadFactor));
3717 };
3718
3719
3720 class JSSetIterator;
3721
3722
3723 class OrderedHashSet: public OrderedHashTable<
3724     OrderedHashSet, JSSetIterator, 1> {
3725  public:
3726   DECLARE_CAST(OrderedHashSet)
3727 };
3728
3729
3730 class JSMapIterator;
3731
3732
3733 class OrderedHashMap
3734     : public OrderedHashTable<OrderedHashMap, JSMapIterator, 2> {
3735  public:
3736   DECLARE_CAST(OrderedHashMap)
3737
3738   inline Object* ValueAt(int entry);
3739
3740   static const int kValueOffset = 1;
3741 };
3742
3743
3744 template <int entrysize>
3745 class WeakHashTableShape : public BaseShape<Handle<Object> > {
3746  public:
3747   static inline bool IsMatch(Handle<Object> key, Object* other);
3748   static inline uint32_t Hash(Handle<Object> key);
3749   static inline uint32_t HashForObject(Handle<Object> key, Object* object);
3750   static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key);
3751   static const int kPrefixSize = 0;
3752   static const int kEntrySize = entrysize;
3753 };
3754
3755
3756 // WeakHashTable maps keys that are arbitrary heap objects to heap object
3757 // values. The table wraps the keys in weak cells and store values directly.
3758 // Thus it references keys weakly and values strongly.
3759 class WeakHashTable: public HashTable<WeakHashTable,
3760                                       WeakHashTableShape<2>,
3761                                       Handle<Object> > {
3762   typedef HashTable<
3763       WeakHashTable, WeakHashTableShape<2>, Handle<Object> > DerivedHashTable;
3764  public:
3765   DECLARE_CAST(WeakHashTable)
3766
3767   // Looks up the value associated with the given key. The hole value is
3768   // returned in case the key is not present.
3769   Object* Lookup(Handle<HeapObject> key);
3770
3771   // Adds (or overwrites) the value associated with the given key. Mapping a
3772   // key to the hole value causes removal of the whole entry.
3773   MUST_USE_RESULT static Handle<WeakHashTable> Put(Handle<WeakHashTable> table,
3774                                                    Handle<HeapObject> key,
3775                                                    Handle<HeapObject> value);
3776
3777   static Handle<FixedArray> GetValues(Handle<WeakHashTable> table);
3778
3779  private:
3780   friend class MarkCompactCollector;
3781
3782   void AddEntry(int entry, Handle<WeakCell> key, Handle<HeapObject> value);
3783
3784   // Returns the index to the value of an entry.
3785   static inline int EntryToValueIndex(int entry) {
3786     return EntryToIndex(entry) + 1;
3787   }
3788 };
3789
3790
3791 // ScopeInfo represents information about different scopes of a source
3792 // program  and the allocation of the scope's variables. Scope information
3793 // is stored in a compressed form in ScopeInfo objects and is used
3794 // at runtime (stack dumps, deoptimization, etc.).
3795
3796 // This object provides quick access to scope info details for runtime
3797 // routines.
3798 class ScopeInfo : public FixedArray {
3799  public:
3800   DECLARE_CAST(ScopeInfo)
3801
3802   // Return the type of this scope.
3803   ScopeType scope_type();
3804
3805   // Does this scope call eval?
3806   bool CallsEval();
3807
3808   // Return the language mode of this scope.
3809   LanguageMode language_mode();
3810
3811   // True if this scope is a (var) declaration scope.
3812   bool is_declaration_scope();
3813
3814   // Does this scope make a sloppy eval call?
3815   bool CallsSloppyEval() { return CallsEval() && is_sloppy(language_mode()); }
3816
3817   // Return the total number of locals allocated on the stack and in the
3818   // context. This includes the parameters that are allocated in the context.
3819   int LocalCount();
3820
3821   // Return the number of stack slots for code. This number consists of two
3822   // parts:
3823   //  1. One stack slot per stack allocated local.
3824   //  2. One stack slot for the function name if it is stack allocated.
3825   int StackSlotCount();
3826
3827   // Return the number of context slots for code if a context is allocated. This
3828   // number consists of three parts:
3829   //  1. Size of fixed header for every context: Context::MIN_CONTEXT_SLOTS
3830   //  2. One context slot per context allocated local.
3831   //  3. One context slot for the function name if it is context allocated.
3832   // Parameters allocated in the context count as context allocated locals. If
3833   // no contexts are allocated for this scope ContextLength returns 0.
3834   int ContextLength();
3835
3836   // Does this scope declare a "this" binding?
3837   bool HasReceiver();
3838
3839   // Does this scope declare a "this" binding, and the "this" binding is stack-
3840   // or context-allocated?
3841   bool HasAllocatedReceiver();
3842
3843   // Is this scope the scope of a named function expression?
3844   bool HasFunctionName();
3845
3846   // Return if this has context allocated locals.
3847   bool HasHeapAllocatedLocals();
3848
3849   // Return if contexts are allocated for this scope.
3850   bool HasContext();
3851
3852   // Return if this is a function scope with "use asm".
3853   inline bool IsAsmModule();
3854
3855   // Return if this is a nested function within an asm module scope.
3856   inline bool IsAsmFunction();
3857
3858   inline bool HasSimpleParameters();
3859
3860   // Return the function_name if present.
3861   String* FunctionName();
3862
3863   // Return the name of the given parameter.
3864   String* ParameterName(int var);
3865
3866   // Return the name of the given local.
3867   String* LocalName(int var);
3868
3869   // Return the name of the given stack local.
3870   String* StackLocalName(int var);
3871
3872   // Return the name of the given stack local.
3873   int StackLocalIndex(int var);
3874
3875   // Return the name of the given context local.
3876   String* ContextLocalName(int var);
3877
3878   // Return the mode of the given context local.
3879   VariableMode ContextLocalMode(int var);
3880
3881   // Return the initialization flag of the given context local.
3882   InitializationFlag ContextLocalInitFlag(int var);
3883
3884   // Return the initialization flag of the given context local.
3885   MaybeAssignedFlag ContextLocalMaybeAssignedFlag(int var);
3886
3887   // Return true if this local was introduced by the compiler, and should not be
3888   // exposed to the user in a debugger.
3889   bool LocalIsSynthetic(int var);
3890
3891   String* StrongModeFreeVariableName(int var);
3892   int StrongModeFreeVariableStartPosition(int var);
3893   int StrongModeFreeVariableEndPosition(int var);
3894
3895   // Lookup support for serialized scope info. Returns the
3896   // the stack slot index for a given slot name if the slot is
3897   // present; otherwise returns a value < 0. The name must be an internalized
3898   // string.
3899   int StackSlotIndex(String* name);
3900
3901   // Lookup support for serialized scope info. Returns the local context slot
3902   // index for a given slot name if the slot is present; otherwise
3903   // returns a value < 0. The name must be an internalized string.
3904   // If the slot is present and mode != NULL, sets *mode to the corresponding
3905   // mode for that variable.
3906   static int ContextSlotIndex(Handle<ScopeInfo> scope_info, Handle<String> name,
3907                               VariableMode* mode, InitializationFlag* init_flag,
3908                               MaybeAssignedFlag* maybe_assigned_flag);
3909
3910   // Similar to ContextSlotIndex() but this method searches only among
3911   // global slots of the serialized scope info. Returns the context slot index
3912   // for a given slot name if the slot is present; otherwise returns a
3913   // value < 0. The name must be an internalized string. If the slot is present
3914   // and mode != NULL, sets *mode to the corresponding mode for that variable.
3915   static int ContextGlobalSlotIndex(Handle<ScopeInfo> scope_info,
3916                                     Handle<String> name, VariableMode* mode,
3917                                     InitializationFlag* init_flag,
3918                                     MaybeAssignedFlag* maybe_assigned_flag);
3919
3920   // Lookup the name of a certain context slot by its index.
3921   String* ContextSlotName(int slot_index);
3922
3923   // Lookup support for serialized scope info. Returns the
3924   // parameter index for a given parameter name if the parameter is present;
3925   // otherwise returns a value < 0. The name must be an internalized string.
3926   int ParameterIndex(String* name);
3927
3928   // Lookup support for serialized scope info. Returns the function context
3929   // slot index if the function name is present and context-allocated (named
3930   // function expressions, only), otherwise returns a value < 0. The name
3931   // must be an internalized string.
3932   int FunctionContextSlotIndex(String* name, VariableMode* mode);
3933
3934   // Lookup support for serialized scope info.  Returns the receiver context
3935   // slot index if scope has a "this" binding, and the binding is
3936   // context-allocated.  Otherwise returns a value < 0.
3937   int ReceiverContextSlotIndex();
3938
3939   FunctionKind function_kind();
3940
3941   static Handle<ScopeInfo> Create(Isolate* isolate, Zone* zone, Scope* scope);
3942   static Handle<ScopeInfo> CreateGlobalThisBinding(Isolate* isolate);
3943
3944   // Serializes empty scope info.
3945   static ScopeInfo* Empty(Isolate* isolate);
3946
3947 #ifdef DEBUG
3948   void Print();
3949 #endif
3950
3951   // The layout of the static part of a ScopeInfo is as follows. Each entry is
3952   // numeric and occupies one array slot.
3953   // 1. A set of properties of the scope
3954   // 2. The number of parameters. This only applies to function scopes. For
3955   //    non-function scopes this is 0.
3956   // 3. The number of non-parameter variables allocated on the stack.
3957   // 4. The number of non-parameter and parameter variables allocated in the
3958   //    context.
3959 #define FOR_EACH_SCOPE_INFO_NUMERIC_FIELD(V) \
3960   V(Flags)                                   \
3961   V(ParameterCount)                          \
3962   V(StackLocalCount)                         \
3963   V(ContextLocalCount)                       \
3964   V(ContextGlobalCount)                      \
3965   V(StrongModeFreeVariableCount)
3966
3967 #define FIELD_ACCESSORS(name)       \
3968   inline void Set##name(int value); \
3969   inline int name();
3970   FOR_EACH_SCOPE_INFO_NUMERIC_FIELD(FIELD_ACCESSORS)
3971 #undef FIELD_ACCESSORS
3972
3973  private:
3974   enum {
3975 #define DECL_INDEX(name) k##name,
3976     FOR_EACH_SCOPE_INFO_NUMERIC_FIELD(DECL_INDEX)
3977 #undef DECL_INDEX
3978     kVariablePartIndex
3979   };
3980
3981   // The layout of the variable part of a ScopeInfo is as follows:
3982   // 1. ParameterEntries:
3983   //    This part stores the names of the parameters for function scopes. One
3984   //    slot is used per parameter, so in total this part occupies
3985   //    ParameterCount() slots in the array. For other scopes than function
3986   //    scopes ParameterCount() is 0.
3987   // 2. StackLocalFirstSlot:
3988   //    Index of a first stack slot for stack local. Stack locals belonging to
3989   //    this scope are located on a stack at slots starting from this index.
3990   // 3. StackLocalEntries:
3991   //    Contains the names of local variables that are allocated on the stack,
3992   //    in increasing order of the stack slot index. First local variable has
3993   //    a stack slot index defined in StackLocalFirstSlot (point 2 above).
3994   //    One slot is used per stack local, so in total this part occupies
3995   //    StackLocalCount() slots in the array.
3996   // 4. ContextLocalNameEntries:
3997   //    Contains the names of local variables and parameters that are allocated
3998   //    in the context. They are stored in increasing order of the context slot
3999   //    index starting with Context::MIN_CONTEXT_SLOTS. One slot is used per
4000   //    context local, so in total this part occupies ContextLocalCount() slots
4001   //    in the array.
4002   // 5. ContextLocalInfoEntries:
4003   //    Contains the variable modes and initialization flags corresponding to
4004   //    the context locals in ContextLocalNameEntries. One slot is used per
4005   //    context local, so in total this part occupies ContextLocalCount()
4006   //    slots in the array.
4007   // 6. StrongModeFreeVariableNameEntries:
4008   //    Stores the names of strong mode free variables.
4009   // 7. StrongModeFreeVariablePositionEntries:
4010   //    Stores the locations (start and end position) of strong mode free
4011   //    variables.
4012   // 8. RecieverEntryIndex:
4013   //    If the scope binds a "this" value, one slot is reserved to hold the
4014   //    context or stack slot index for the variable.
4015   // 9. FunctionNameEntryIndex:
4016   //    If the scope belongs to a named function expression this part contains
4017   //    information about the function variable. It always occupies two array
4018   //    slots:  a. The name of the function variable.
4019   //            b. The context or stack slot index for the variable.
4020   int ParameterEntriesIndex();
4021   int StackLocalFirstSlotIndex();
4022   int StackLocalEntriesIndex();
4023   int ContextLocalNameEntriesIndex();
4024   int ContextGlobalNameEntriesIndex();
4025   int ContextLocalInfoEntriesIndex();
4026   int ContextGlobalInfoEntriesIndex();
4027   int StrongModeFreeVariableNameEntriesIndex();
4028   int StrongModeFreeVariablePositionEntriesIndex();
4029   int ReceiverEntryIndex();
4030   int FunctionNameEntryIndex();
4031
4032   int Lookup(Handle<String> name, int start, int end, VariableMode* mode,
4033              VariableLocation* location, InitializationFlag* init_flag,
4034              MaybeAssignedFlag* maybe_assigned_flag);
4035
4036   // Used for the function name variable for named function expressions, and for
4037   // the receiver.
4038   enum VariableAllocationInfo { NONE, STACK, CONTEXT, UNUSED };
4039
4040   // Properties of scopes.
4041   class ScopeTypeField : public BitField<ScopeType, 0, 4> {};
4042   class CallsEvalField : public BitField<bool, ScopeTypeField::kNext, 1> {};
4043   STATIC_ASSERT(LANGUAGE_END == 3);
4044   class LanguageModeField
4045       : public BitField<LanguageMode, CallsEvalField::kNext, 2> {};
4046   class DeclarationScopeField
4047       : public BitField<bool, LanguageModeField::kNext, 1> {};
4048   class ReceiverVariableField
4049       : public BitField<VariableAllocationInfo, DeclarationScopeField::kNext,
4050                         2> {};
4051   class FunctionVariableField
4052       : public BitField<VariableAllocationInfo, ReceiverVariableField::kNext,
4053                         2> {};
4054   class FunctionVariableMode
4055       : public BitField<VariableMode, FunctionVariableField::kNext, 3> {};
4056   class AsmModuleField : public BitField<bool, FunctionVariableMode::kNext, 1> {
4057   };
4058   class AsmFunctionField : public BitField<bool, AsmModuleField::kNext, 1> {};
4059   class HasSimpleParametersField
4060       : public BitField<bool, AsmFunctionField::kNext, 1> {};
4061   class FunctionKindField
4062       : public BitField<FunctionKind, HasSimpleParametersField::kNext, 8> {};
4063
4064   // BitFields representing the encoded information for context locals in the
4065   // ContextLocalInfoEntries part.
4066   class ContextLocalMode:      public BitField<VariableMode,         0, 3> {};
4067   class ContextLocalInitFlag:  public BitField<InitializationFlag,   3, 1> {};
4068   class ContextLocalMaybeAssignedFlag
4069       : public BitField<MaybeAssignedFlag, 4, 1> {};
4070
4071   friend class ScopeIterator;
4072 };
4073
4074
4075 // The cache for maps used by normalized (dictionary mode) objects.
4076 // Such maps do not have property descriptors, so a typical program
4077 // needs very limited number of distinct normalized maps.
4078 class NormalizedMapCache: public FixedArray {
4079  public:
4080   static Handle<NormalizedMapCache> New(Isolate* isolate);
4081
4082   MUST_USE_RESULT MaybeHandle<Map> Get(Handle<Map> fast_map,
4083                                        PropertyNormalizationMode mode);
4084   void Set(Handle<Map> fast_map, Handle<Map> normalized_map);
4085
4086   void Clear();
4087
4088   DECLARE_CAST(NormalizedMapCache)
4089
4090   static inline bool IsNormalizedMapCache(const Object* obj);
4091
4092   DECLARE_VERIFIER(NormalizedMapCache)
4093  private:
4094   static const int kEntries = 64;
4095
4096   static inline int GetIndex(Handle<Map> map);
4097
4098   // The following declarations hide base class methods.
4099   Object* get(int index);
4100   void set(int index, Object* value);
4101 };
4102
4103
4104 // ByteArray represents fixed sized byte arrays.  Used for the relocation info
4105 // that is attached to code objects.
4106 class ByteArray: public FixedArrayBase {
4107  public:
4108   inline int Size();
4109
4110   // Setter and getter.
4111   inline byte get(int index);
4112   inline void set(int index, byte value);
4113
4114   // Treat contents as an int array.
4115   inline int get_int(int index);
4116
4117   static int SizeFor(int length) {
4118     return OBJECT_POINTER_ALIGN(kHeaderSize + length);
4119   }
4120   // We use byte arrays for free blocks in the heap.  Given a desired size in
4121   // bytes that is a multiple of the word size and big enough to hold a byte
4122   // array, this function returns the number of elements a byte array should
4123   // have.
4124   static int LengthFor(int size_in_bytes) {
4125     DCHECK(IsAligned(size_in_bytes, kPointerSize));
4126     DCHECK(size_in_bytes >= kHeaderSize);
4127     return size_in_bytes - kHeaderSize;
4128   }
4129
4130   // Returns data start address.
4131   inline Address GetDataStartAddress();
4132
4133   // Returns a pointer to the ByteArray object for a given data start address.
4134   static inline ByteArray* FromDataStartAddress(Address address);
4135
4136   DECLARE_CAST(ByteArray)
4137
4138   // Dispatched behavior.
4139   inline int ByteArraySize();
4140   DECLARE_PRINTER(ByteArray)
4141   DECLARE_VERIFIER(ByteArray)
4142
4143   // Layout description.
4144   static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
4145
4146   // Maximal memory consumption for a single ByteArray.
4147   static const int kMaxSize = 512 * MB;
4148   // Maximal length of a single ByteArray.
4149   static const int kMaxLength = kMaxSize - kHeaderSize;
4150
4151  private:
4152   DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArray);
4153 };
4154
4155
4156 // BytecodeArray represents a sequence of interpreter bytecodes.
4157 class BytecodeArray : public FixedArrayBase {
4158  public:
4159   static int SizeFor(int length) {
4160     return OBJECT_POINTER_ALIGN(kHeaderSize + length);
4161   }
4162
4163   // Setter and getter
4164   inline byte get(int index);
4165   inline void set(int index, byte value);
4166
4167   // Returns data start address.
4168   inline Address GetFirstBytecodeAddress();
4169
4170   // Accessors for frame size.
4171   inline int frame_size() const;
4172   inline void set_frame_size(int frame_size);
4173
4174   // Accessors for parameter count (including implicit 'this' receiver).
4175   inline int parameter_count() const;
4176   inline void set_parameter_count(int number_of_parameters);
4177
4178   // Accessors for the constant pool.
4179   DECL_ACCESSORS(constant_pool, FixedArray)
4180
4181   DECLARE_CAST(BytecodeArray)
4182
4183   // Dispatched behavior.
4184   inline int BytecodeArraySize();
4185   inline void BytecodeArrayIterateBody(ObjectVisitor* v);
4186
4187   DECLARE_PRINTER(BytecodeArray)
4188   DECLARE_VERIFIER(BytecodeArray)
4189
4190   void Disassemble(std::ostream& os);
4191
4192   // Layout description.
4193   static const int kFrameSizeOffset = FixedArrayBase::kHeaderSize;
4194   static const int kParameterSizeOffset = kFrameSizeOffset + kIntSize;
4195   static const int kConstantPoolOffset = kParameterSizeOffset + kIntSize;
4196   static const int kHeaderSize = kConstantPoolOffset + kPointerSize;
4197
4198   static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
4199
4200   // Maximal memory consumption for a single BytecodeArray.
4201   static const int kMaxSize = 512 * MB;
4202   // Maximal length of a single BytecodeArray.
4203   static const int kMaxLength = kMaxSize - kHeaderSize;
4204
4205  private:
4206   DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray);
4207 };
4208
4209
4210 // FreeSpace are fixed-size free memory blocks used by the heap and GC.
4211 // They look like heap objects (are heap object tagged and have a map) so that
4212 // the heap remains iterable.  They have a size and a next pointer.
4213 // The next pointer is the raw address of the next FreeSpace object (or NULL)
4214 // in the free list.
4215 class FreeSpace: public HeapObject {
4216  public:
4217   // [size]: size of the free space including the header.
4218   inline int size() const;
4219   inline void set_size(int value);
4220
4221   inline int nobarrier_size() const;
4222   inline void nobarrier_set_size(int value);
4223
4224   inline int Size();
4225
4226   // Accessors for the next field.
4227   inline FreeSpace* next();
4228   inline FreeSpace** next_address();
4229   inline void set_next(FreeSpace* next);
4230
4231   inline static FreeSpace* cast(HeapObject* obj);
4232
4233   // Dispatched behavior.
4234   DECLARE_PRINTER(FreeSpace)
4235   DECLARE_VERIFIER(FreeSpace)
4236
4237   // Layout description.
4238   // Size is smi tagged when it is stored.
4239   static const int kSizeOffset = HeapObject::kHeaderSize;
4240   static const int kNextOffset = POINTER_SIZE_ALIGN(kSizeOffset + kPointerSize);
4241
4242  private:
4243   DISALLOW_IMPLICIT_CONSTRUCTORS(FreeSpace);
4244 };
4245
4246
4247 // V has parameters (Type, type, TYPE, C type, element_size)
4248 #define TYPED_ARRAYS(V) \
4249   V(Uint8, uint8, UINT8, uint8_t, 1)                                           \
4250   V(Int8, int8, INT8, int8_t, 1)                                               \
4251   V(Uint16, uint16, UINT16, uint16_t, 2)                                       \
4252   V(Int16, int16, INT16, int16_t, 2)                                           \
4253   V(Uint32, uint32, UINT32, uint32_t, 4)                                       \
4254   V(Int32, int32, INT32, int32_t, 4)                                           \
4255   V(Float32, float32, FLOAT32, float, 4)                                       \
4256   V(Float64, float64, FLOAT64, double, 8)                                      \
4257   V(Uint8Clamped, uint8_clamped, UINT8_CLAMPED, uint8_t, 1)
4258
4259
4260 class FixedTypedArrayBase: public FixedArrayBase {
4261  public:
4262   // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr.
4263   DECL_ACCESSORS(base_pointer, Object)
4264
4265   // [external_pointer]: Contains the offset between base_pointer and the start
4266   // of the data. If the base_pointer is a nullptr, the external_pointer
4267   // therefore points to the actual backing store.
4268   DECL_ACCESSORS(external_pointer, void)
4269
4270   // Dispatched behavior.
4271   inline void FixedTypedArrayBaseIterateBody(ObjectVisitor* v);
4272
4273   template <typename StaticVisitor>
4274   inline void FixedTypedArrayBaseIterateBody();
4275
4276   DECLARE_CAST(FixedTypedArrayBase)
4277
4278   static const int kBasePointerOffset = FixedArrayBase::kHeaderSize;
4279   static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize;
4280   static const int kHeaderSize =
4281       DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize);
4282
4283   static const int kDataOffset = kHeaderSize;
4284
4285   inline int size();
4286
4287   static inline int TypedArraySize(InstanceType type, int length);
4288   inline int TypedArraySize(InstanceType type);
4289
4290   // Use with care: returns raw pointer into heap.
4291   inline void* DataPtr();
4292
4293   inline int DataSize();
4294
4295  private:
4296   static inline int ElementSize(InstanceType type);
4297
4298   inline int DataSize(InstanceType type);
4299
4300   DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArrayBase);
4301 };
4302
4303
4304 template <class Traits>
4305 class FixedTypedArray: public FixedTypedArrayBase {
4306  public:
4307   typedef typename Traits::ElementType ElementType;
4308   static const InstanceType kInstanceType = Traits::kInstanceType;
4309
4310   DECLARE_CAST(FixedTypedArray<Traits>)
4311
4312   inline ElementType get_scalar(int index);
4313   static inline Handle<Object> get(Handle<FixedTypedArray> array, int index);
4314   inline void set(int index, ElementType value);
4315
4316   static inline ElementType from_int(int value);
4317   static inline ElementType from_double(double value);
4318
4319   // This accessor applies the correct conversion from Smi, HeapNumber
4320   // and undefined.
4321   inline void SetValue(uint32_t index, Object* value);
4322
4323   DECLARE_PRINTER(FixedTypedArray)
4324   DECLARE_VERIFIER(FixedTypedArray)
4325
4326  private:
4327   DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArray);
4328 };
4329
4330 #define FIXED_TYPED_ARRAY_TRAITS(Type, type, TYPE, elementType, size)         \
4331   class Type##ArrayTraits {                                                   \
4332    public:   /* NOLINT */                                                     \
4333     typedef elementType ElementType;                                          \
4334     static const InstanceType kInstanceType = FIXED_##TYPE##_ARRAY_TYPE;      \
4335     static const char* Designator() { return #type " array"; }                \
4336     static inline Handle<Object> ToHandle(Isolate* isolate,                   \
4337                                           elementType scalar);                \
4338     static inline elementType defaultValue();                                 \
4339   };                                                                          \
4340                                                                               \
4341   typedef FixedTypedArray<Type##ArrayTraits> Fixed##Type##Array;
4342
4343 TYPED_ARRAYS(FIXED_TYPED_ARRAY_TRAITS)
4344
4345 #undef FIXED_TYPED_ARRAY_TRAITS
4346
4347
4348 // DeoptimizationInputData is a fixed array used to hold the deoptimization
4349 // data for code generated by the Hydrogen/Lithium compiler.  It also
4350 // contains information about functions that were inlined.  If N different
4351 // functions were inlined then first N elements of the literal array will
4352 // contain these functions.
4353 //
4354 // It can be empty.
4355 class DeoptimizationInputData: public FixedArray {
4356  public:
4357   // Layout description.  Indices in the array.
4358   static const int kTranslationByteArrayIndex = 0;
4359   static const int kInlinedFunctionCountIndex = 1;
4360   static const int kLiteralArrayIndex = 2;
4361   static const int kOsrAstIdIndex = 3;
4362   static const int kOsrPcOffsetIndex = 4;
4363   static const int kOptimizationIdIndex = 5;
4364   static const int kSharedFunctionInfoIndex = 6;
4365   static const int kWeakCellCacheIndex = 7;
4366   static const int kFirstDeoptEntryIndex = 8;
4367
4368   // Offsets of deopt entry elements relative to the start of the entry.
4369   static const int kAstIdRawOffset = 0;
4370   static const int kTranslationIndexOffset = 1;
4371   static const int kArgumentsStackHeightOffset = 2;
4372   static const int kPcOffset = 3;
4373   static const int kDeoptEntrySize = 4;
4374
4375   // Simple element accessors.
4376 #define DECLARE_ELEMENT_ACCESSORS(name, type) \
4377   inline type* name();                        \
4378   inline void Set##name(type* value);
4379
4380   DECLARE_ELEMENT_ACCESSORS(TranslationByteArray, ByteArray)
4381   DECLARE_ELEMENT_ACCESSORS(InlinedFunctionCount, Smi)
4382   DECLARE_ELEMENT_ACCESSORS(LiteralArray, FixedArray)
4383   DECLARE_ELEMENT_ACCESSORS(OsrAstId, Smi)
4384   DECLARE_ELEMENT_ACCESSORS(OsrPcOffset, Smi)
4385   DECLARE_ELEMENT_ACCESSORS(OptimizationId, Smi)
4386   DECLARE_ELEMENT_ACCESSORS(SharedFunctionInfo, Object)
4387   DECLARE_ELEMENT_ACCESSORS(WeakCellCache, Object)
4388
4389 #undef DECLARE_ELEMENT_ACCESSORS
4390
4391   // Accessors for elements of the ith deoptimization entry.
4392 #define DECLARE_ENTRY_ACCESSORS(name, type) \
4393   inline type* name(int i);                 \
4394   inline void Set##name(int i, type* value);
4395
4396   DECLARE_ENTRY_ACCESSORS(AstIdRaw, Smi)
4397   DECLARE_ENTRY_ACCESSORS(TranslationIndex, Smi)
4398   DECLARE_ENTRY_ACCESSORS(ArgumentsStackHeight, Smi)
4399   DECLARE_ENTRY_ACCESSORS(Pc, Smi)
4400
4401 #undef DECLARE_ENTRY_ACCESSORS
4402
4403   inline BailoutId AstId(int i);
4404
4405   inline void SetAstId(int i, BailoutId value);
4406
4407   inline int DeoptCount();
4408
4409   // Allocates a DeoptimizationInputData.
4410   static Handle<DeoptimizationInputData> New(Isolate* isolate,
4411                                              int deopt_entry_count,
4412                                              PretenureFlag pretenure);
4413
4414   DECLARE_CAST(DeoptimizationInputData)
4415
4416 #ifdef ENABLE_DISASSEMBLER
4417   void DeoptimizationInputDataPrint(std::ostream& os);  // NOLINT
4418 #endif
4419
4420  private:
4421   static int IndexForEntry(int i) {
4422     return kFirstDeoptEntryIndex + (i * kDeoptEntrySize);
4423   }
4424
4425
4426   static int LengthFor(int entry_count) { return IndexForEntry(entry_count); }
4427 };
4428
4429
4430 // DeoptimizationOutputData is a fixed array used to hold the deoptimization
4431 // data for code generated by the full compiler.
4432 // The format of the these objects is
4433 //   [i * 2]: Ast ID for ith deoptimization.
4434 //   [i * 2 + 1]: PC and state of ith deoptimization
4435 class DeoptimizationOutputData: public FixedArray {
4436  public:
4437   inline int DeoptPoints();
4438
4439   inline BailoutId AstId(int index);
4440
4441   inline void SetAstId(int index, BailoutId id);
4442
4443   inline Smi* PcAndState(int index);
4444   inline void SetPcAndState(int index, Smi* offset);
4445
4446   static int LengthOfFixedArray(int deopt_points) {
4447     return deopt_points * 2;
4448   }
4449
4450   // Allocates a DeoptimizationOutputData.
4451   static Handle<DeoptimizationOutputData> New(Isolate* isolate,
4452                                               int number_of_deopt_points,
4453                                               PretenureFlag pretenure);
4454
4455   DECLARE_CAST(DeoptimizationOutputData)
4456
4457 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER)
4458   void DeoptimizationOutputDataPrint(std::ostream& os);  // NOLINT
4459 #endif
4460 };
4461
4462
4463 // HandlerTable is a fixed array containing entries for exception handlers in
4464 // the code object it is associated with. The tables comes in two flavors:
4465 // 1) Based on ranges: Used for unoptimized code. Contains one entry per
4466 //    exception handler and a range representing the try-block covered by that
4467 //    handler. Layout looks as follows:
4468 //      [ range-start , range-end , handler-offset , stack-depth ]
4469 // 2) Based on return addresses: Used for turbofanned code. Contains one entry
4470 //    per call-site that could throw an exception. Layout looks as follows:
4471 //      [ return-address-offset , handler-offset ]
4472 class HandlerTable : public FixedArray {
4473  public:
4474   // Conservative prediction whether a given handler will locally catch an
4475   // exception or cause a re-throw to outside the code boundary. Since this is
4476   // undecidable it is merely an approximation (e.g. useful for debugger).
4477   enum CatchPrediction { UNCAUGHT, CAUGHT };
4478
4479   // Accessors for handler table based on ranges.
4480   inline void SetRangeStart(int index, int value);
4481   inline void SetRangeEnd(int index, int value);
4482   inline void SetRangeHandler(int index, int offset, CatchPrediction pred);
4483   inline void SetRangeDepth(int index, int value);
4484
4485   // Accessors for handler table based on return addresses.
4486   inline void SetReturnOffset(int index, int value);
4487   inline void SetReturnHandler(int index, int offset, CatchPrediction pred);
4488
4489   // Lookup handler in a table based on ranges.
4490   int LookupRange(int pc_offset, int* stack_depth, CatchPrediction* prediction);
4491
4492   // Lookup handler in a table based on return addresses.
4493   int LookupReturn(int pc_offset, CatchPrediction* prediction);
4494
4495   // Returns the required length of the underlying fixed array.
4496   static int LengthForRange(int entries) { return entries * kRangeEntrySize; }
4497   static int LengthForReturn(int entries) { return entries * kReturnEntrySize; }
4498
4499   DECLARE_CAST(HandlerTable)
4500
4501 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER)
4502   void HandlerTableRangePrint(std::ostream& os);   // NOLINT
4503   void HandlerTableReturnPrint(std::ostream& os);  // NOLINT
4504 #endif
4505
4506  private:
4507   // Layout description for handler table based on ranges.
4508   static const int kRangeStartIndex = 0;
4509   static const int kRangeEndIndex = 1;
4510   static const int kRangeHandlerIndex = 2;
4511   static const int kRangeDepthIndex = 3;
4512   static const int kRangeEntrySize = 4;
4513
4514   // Layout description for handler table based on return addresses.
4515   static const int kReturnOffsetIndex = 0;
4516   static const int kReturnHandlerIndex = 1;
4517   static const int kReturnEntrySize = 2;
4518
4519   // Encoding of the {handler} field.
4520   class HandlerPredictionField : public BitField<CatchPrediction, 0, 1> {};
4521   class HandlerOffsetField : public BitField<int, 1, 30> {};
4522 };
4523
4524
4525 // Code describes objects with on-the-fly generated machine code.
4526 class Code: public HeapObject {
4527  public:
4528   // Opaque data type for encapsulating code flags like kind, inline
4529   // cache state, and arguments count.
4530   typedef uint32_t Flags;
4531
4532 #define NON_IC_KIND_LIST(V) \
4533   V(FUNCTION)               \
4534   V(OPTIMIZED_FUNCTION)     \
4535   V(STUB)                   \
4536   V(HANDLER)                \
4537   V(BUILTIN)                \
4538   V(REGEXP)                 \
4539   V(PLACEHOLDER)
4540
4541 #define IC_KIND_LIST(V) \
4542   V(LOAD_IC)            \
4543   V(KEYED_LOAD_IC)      \
4544   V(CALL_IC)            \
4545   V(STORE_IC)           \
4546   V(KEYED_STORE_IC)     \
4547   V(BINARY_OP_IC)       \
4548   V(COMPARE_IC)         \
4549   V(COMPARE_NIL_IC)     \
4550   V(TO_BOOLEAN_IC)
4551
4552 #define CODE_KIND_LIST(V) \
4553   NON_IC_KIND_LIST(V)     \
4554   IC_KIND_LIST(V)
4555
4556   enum Kind {
4557 #define DEFINE_CODE_KIND_ENUM(name) name,
4558     CODE_KIND_LIST(DEFINE_CODE_KIND_ENUM)
4559 #undef DEFINE_CODE_KIND_ENUM
4560     NUMBER_OF_KINDS
4561   };
4562
4563   // No more than 16 kinds. The value is currently encoded in four bits in
4564   // Flags.
4565   STATIC_ASSERT(NUMBER_OF_KINDS <= 16);
4566
4567   static const char* Kind2String(Kind kind);
4568
4569   // Types of stubs.
4570   enum StubType {
4571     NORMAL,
4572     FAST
4573   };
4574
4575   static const int kPrologueOffsetNotSet = -1;
4576
4577 #ifdef ENABLE_DISASSEMBLER
4578   // Printing
4579   static const char* ICState2String(InlineCacheState state);
4580   static const char* StubType2String(StubType type);
4581   static void PrintExtraICState(std::ostream& os,  // NOLINT
4582                                 Kind kind, ExtraICState extra);
4583   void Disassemble(const char* name, std::ostream& os);  // NOLINT
4584 #endif  // ENABLE_DISASSEMBLER
4585
4586   // [instruction_size]: Size of the native instructions
4587   inline int instruction_size() const;
4588   inline void set_instruction_size(int value);
4589
4590   // [relocation_info]: Code relocation information
4591   DECL_ACCESSORS(relocation_info, ByteArray)
4592   void InvalidateRelocation();
4593   void InvalidateEmbeddedObjects();
4594
4595   // [handler_table]: Fixed array containing offsets of exception handlers.
4596   DECL_ACCESSORS(handler_table, FixedArray)
4597
4598   // [deoptimization_data]: Array containing data for deopt.
4599   DECL_ACCESSORS(deoptimization_data, FixedArray)
4600
4601   // [raw_type_feedback_info]: This field stores various things, depending on
4602   // the kind of the code object.
4603   //   FUNCTION           => type feedback information.
4604   //   STUB and ICs       => major/minor key as Smi.
4605   DECL_ACCESSORS(raw_type_feedback_info, Object)
4606   inline Object* type_feedback_info();
4607   inline void set_type_feedback_info(
4608       Object* value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
4609   inline uint32_t stub_key();
4610   inline void set_stub_key(uint32_t key);
4611
4612   // [next_code_link]: Link for lists of optimized or deoptimized code.
4613   // Note that storage for this field is overlapped with typefeedback_info.
4614   DECL_ACCESSORS(next_code_link, Object)
4615
4616   // [gc_metadata]: Field used to hold GC related metadata. The contents of this
4617   // field does not have to be traced during garbage collection since
4618   // it is only used by the garbage collector itself.
4619   DECL_ACCESSORS(gc_metadata, Object)
4620
4621   // [ic_age]: Inline caching age: the value of the Heap::global_ic_age
4622   // at the moment when this object was created.
4623   inline void set_ic_age(int count);
4624   inline int ic_age() const;
4625
4626   // [prologue_offset]: Offset of the function prologue, used for aging
4627   // FUNCTIONs and OPTIMIZED_FUNCTIONs.
4628   inline int prologue_offset() const;
4629   inline void set_prologue_offset(int offset);
4630
4631   // [constant_pool offset]: Offset of the constant pool.
4632   // Valid for FLAG_enable_embedded_constant_pool only
4633   inline int constant_pool_offset() const;
4634   inline void set_constant_pool_offset(int offset);
4635
4636   // Unchecked accessors to be used during GC.
4637   inline ByteArray* unchecked_relocation_info();
4638
4639   inline int relocation_size();
4640
4641   // [flags]: Various code flags.
4642   inline Flags flags();
4643   inline void set_flags(Flags flags);
4644
4645   // [flags]: Access to specific code flags.
4646   inline Kind kind();
4647   inline InlineCacheState ic_state();  // Only valid for IC stubs.
4648   inline ExtraICState extra_ic_state();  // Only valid for IC stubs.
4649
4650   inline StubType type();  // Only valid for monomorphic IC stubs.
4651
4652   // Testers for IC stub kinds.
4653   inline bool is_inline_cache_stub();
4654   inline bool is_debug_stub();
4655   inline bool is_handler();
4656   inline bool is_load_stub();
4657   inline bool is_keyed_load_stub();
4658   inline bool is_store_stub();
4659   inline bool is_keyed_store_stub();
4660   inline bool is_call_stub();
4661   inline bool is_binary_op_stub();
4662   inline bool is_compare_ic_stub();
4663   inline bool is_compare_nil_ic_stub();
4664   inline bool is_to_boolean_ic_stub();
4665   inline bool is_keyed_stub();
4666   inline bool is_optimized_code();
4667   inline bool embeds_maps_weakly();
4668
4669   inline bool IsCodeStubOrIC();
4670   inline bool IsJavaScriptCode();
4671
4672   inline void set_raw_kind_specific_flags1(int value);
4673   inline void set_raw_kind_specific_flags2(int value);
4674
4675   // [is_crankshafted]: For kind STUB or ICs, tells whether or not a code
4676   // object was generated by either the hydrogen or the TurboFan optimizing
4677   // compiler (but it may not be an optimized function).
4678   inline bool is_crankshafted();
4679   inline bool is_hydrogen_stub();  // Crankshafted, but not a function.
4680   inline void set_is_crankshafted(bool value);
4681
4682   // [is_turbofanned]: For kind STUB or OPTIMIZED_FUNCTION, tells whether the
4683   // code object was generated by the TurboFan optimizing compiler.
4684   inline bool is_turbofanned();
4685   inline void set_is_turbofanned(bool value);
4686
4687   // [can_have_weak_objects]: For kind OPTIMIZED_FUNCTION, tells whether the
4688   // embedded objects in code should be treated weakly.
4689   inline bool can_have_weak_objects();
4690   inline void set_can_have_weak_objects(bool value);
4691
4692   // [has_deoptimization_support]: For FUNCTION kind, tells if it has
4693   // deoptimization support.
4694   inline bool has_deoptimization_support();
4695   inline void set_has_deoptimization_support(bool value);
4696
4697   // [has_debug_break_slots]: For FUNCTION kind, tells if it has
4698   // been compiled with debug break slots.
4699   inline bool has_debug_break_slots();
4700   inline void set_has_debug_break_slots(bool value);
4701
4702   // [has_reloc_info_for_serialization]: For FUNCTION kind, tells if its
4703   // reloc info includes runtime and external references to support
4704   // serialization/deserialization.
4705   inline bool has_reloc_info_for_serialization();
4706   inline void set_has_reloc_info_for_serialization(bool value);
4707
4708   // [allow_osr_at_loop_nesting_level]: For FUNCTION kind, tells for
4709   // how long the function has been marked for OSR and therefore which
4710   // level of loop nesting we are willing to do on-stack replacement
4711   // for.
4712   inline void set_allow_osr_at_loop_nesting_level(int level);
4713   inline int allow_osr_at_loop_nesting_level();
4714
4715   // [profiler_ticks]: For FUNCTION kind, tells for how many profiler ticks
4716   // the code object was seen on the stack with no IC patching going on.
4717   inline int profiler_ticks();
4718   inline void set_profiler_ticks(int ticks);
4719
4720   // [builtin_index]: For BUILTIN kind, tells which builtin index it has.
4721   // For builtins, tells which builtin index it has.
4722   // Note that builtins can have a code kind other than BUILTIN, which means
4723   // that for arbitrary code objects, this index value may be random garbage.
4724   // To verify in that case, compare the code object to the indexed builtin.
4725   inline int builtin_index();
4726   inline void set_builtin_index(int id);
4727
4728   // [stack_slots]: For kind OPTIMIZED_FUNCTION, the number of stack slots
4729   // reserved in the code prologue.
4730   inline unsigned stack_slots();
4731   inline void set_stack_slots(unsigned slots);
4732
4733   // [safepoint_table_start]: For kind OPTIMIZED_FUNCTION, the offset in
4734   // the instruction stream where the safepoint table starts.
4735   inline unsigned safepoint_table_offset();
4736   inline void set_safepoint_table_offset(unsigned offset);
4737
4738   // [back_edge_table_start]: For kind FUNCTION, the offset in the
4739   // instruction stream where the back edge table starts.
4740   inline unsigned back_edge_table_offset();
4741   inline void set_back_edge_table_offset(unsigned offset);
4742
4743   inline bool back_edges_patched_for_osr();
4744
4745   // [to_boolean_foo]: For kind TO_BOOLEAN_IC tells what state the stub is in.
4746   inline uint16_t to_boolean_state();
4747
4748   // [has_function_cache]: For kind STUB tells whether there is a function
4749   // cache is passed to the stub.
4750   inline bool has_function_cache();
4751   inline void set_has_function_cache(bool flag);
4752
4753
4754   // [marked_for_deoptimization]: For kind OPTIMIZED_FUNCTION tells whether
4755   // the code is going to be deoptimized because of dead embedded maps.
4756   inline bool marked_for_deoptimization();
4757   inline void set_marked_for_deoptimization(bool flag);
4758
4759   // [constant_pool]: The constant pool for this function.
4760   inline Address constant_pool();
4761
4762   // Get the safepoint entry for the given pc.
4763   SafepointEntry GetSafepointEntry(Address pc);
4764
4765   // Find an object in a stub with a specified map
4766   Object* FindNthObject(int n, Map* match_map);
4767
4768   // Find the first allocation site in an IC stub.
4769   AllocationSite* FindFirstAllocationSite();
4770
4771   // Find the first map in an IC stub.
4772   Map* FindFirstMap();
4773   void FindAllMaps(MapHandleList* maps);
4774
4775   // Find the first handler in an IC stub.
4776   Code* FindFirstHandler();
4777
4778   // Find |length| handlers and put them into |code_list|. Returns false if not
4779   // enough handlers can be found.
4780   bool FindHandlers(CodeHandleList* code_list, int length = -1);
4781
4782   // Find the handler for |map|.
4783   MaybeHandle<Code> FindHandlerForMap(Map* map);
4784
4785   // Find the first name in an IC stub.
4786   Name* FindFirstName();
4787
4788   class FindAndReplacePattern;
4789   // For each (map-to-find, object-to-replace) pair in the pattern, this
4790   // function replaces the corresponding placeholder in the code with the
4791   // object-to-replace. The function assumes that pairs in the pattern come in
4792   // the same order as the placeholders in the code.
4793   // If the placeholder is a weak cell, then the value of weak cell is matched
4794   // against the map-to-find.
4795   void FindAndReplace(const FindAndReplacePattern& pattern);
4796
4797   // The entire code object including its header is copied verbatim to the
4798   // snapshot so that it can be written in one, fast, memcpy during
4799   // deserialization. The deserializer will overwrite some pointers, rather
4800   // like a runtime linker, but the random allocation addresses used in the
4801   // mksnapshot process would still be present in the unlinked snapshot data,
4802   // which would make snapshot production non-reproducible. This method wipes
4803   // out the to-be-overwritten header data for reproducible snapshots.
4804   inline void WipeOutHeader();
4805
4806   // Flags operations.
4807   static inline Flags ComputeFlags(
4808       Kind kind, InlineCacheState ic_state = UNINITIALIZED,
4809       ExtraICState extra_ic_state = kNoExtraICState, StubType type = NORMAL,
4810       CacheHolderFlag holder = kCacheOnReceiver);
4811
4812   static inline Flags ComputeMonomorphicFlags(
4813       Kind kind, ExtraICState extra_ic_state = kNoExtraICState,
4814       CacheHolderFlag holder = kCacheOnReceiver, StubType type = NORMAL);
4815
4816   static inline Flags ComputeHandlerFlags(
4817       Kind handler_kind, StubType type = NORMAL,
4818       CacheHolderFlag holder = kCacheOnReceiver);
4819
4820   static inline InlineCacheState ExtractICStateFromFlags(Flags flags);
4821   static inline StubType ExtractTypeFromFlags(Flags flags);
4822   static inline CacheHolderFlag ExtractCacheHolderFromFlags(Flags flags);
4823   static inline Kind ExtractKindFromFlags(Flags flags);
4824   static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags);
4825
4826   static inline Flags RemoveTypeFromFlags(Flags flags);
4827   static inline Flags RemoveTypeAndHolderFromFlags(Flags flags);
4828
4829   // Convert a target address into a code object.
4830   static inline Code* GetCodeFromTargetAddress(Address address);
4831
4832   // Convert an entry address into an object.
4833   static inline Object* GetObjectFromEntryAddress(Address location_of_address);
4834
4835   // Returns the address of the first instruction.
4836   inline byte* instruction_start();
4837
4838   // Returns the address right after the last instruction.
4839   inline byte* instruction_end();
4840
4841   // Returns the size of the instructions, padding, and relocation information.
4842   inline int body_size();
4843
4844   // Returns the address of the first relocation info (read backwards!).
4845   inline byte* relocation_start();
4846
4847   // Code entry point.
4848   inline byte* entry();
4849
4850   // Returns true if pc is inside this object's instructions.
4851   inline bool contains(byte* pc);
4852
4853   // Relocate the code by delta bytes. Called to signal that this code
4854   // object has been moved by delta bytes.
4855   void Relocate(intptr_t delta);
4856
4857   // Migrate code described by desc.
4858   void CopyFrom(const CodeDesc& desc);
4859
4860   // Returns the object size for a given body (used for allocation).
4861   static int SizeFor(int body_size) {
4862     DCHECK_SIZE_TAG_ALIGNED(body_size);
4863     return RoundUp(kHeaderSize + body_size, kCodeAlignment);
4864   }
4865
4866   // Calculate the size of the code object to report for log events. This takes
4867   // the layout of the code object into account.
4868   inline int ExecutableSize();
4869
4870   // Locating source position.
4871   int SourcePosition(Address pc);
4872   int SourceStatementPosition(Address pc);
4873
4874   DECLARE_CAST(Code)
4875
4876   // Dispatched behavior.
4877   inline int CodeSize();
4878   inline void CodeIterateBody(ObjectVisitor* v);
4879
4880   template<typename StaticVisitor>
4881   inline void CodeIterateBody(Heap* heap);
4882
4883   DECLARE_PRINTER(Code)
4884   DECLARE_VERIFIER(Code)
4885
4886   void ClearInlineCaches();
4887   void ClearInlineCaches(Kind kind);
4888
4889   BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset);
4890   uint32_t TranslateAstIdToPcOffset(BailoutId ast_id);
4891
4892 #define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge,
4893   enum Age {
4894     kToBeExecutedOnceCodeAge = -3,
4895     kNotExecutedCodeAge = -2,
4896     kExecutedOnceCodeAge = -1,
4897     kNoAgeCodeAge = 0,
4898     CODE_AGE_LIST(DECLARE_CODE_AGE_ENUM)
4899     kAfterLastCodeAge,
4900     kFirstCodeAge = kToBeExecutedOnceCodeAge,
4901     kLastCodeAge = kAfterLastCodeAge - 1,
4902     kCodeAgeCount = kAfterLastCodeAge - kFirstCodeAge - 1,
4903     kIsOldCodeAge = kSexagenarianCodeAge,
4904     kPreAgedCodeAge = kIsOldCodeAge - 1
4905   };
4906 #undef DECLARE_CODE_AGE_ENUM
4907
4908   // Code aging.  Indicates how many full GCs this code has survived without
4909   // being entered through the prologue.  Used to determine when it is
4910   // relatively safe to flush this code object and replace it with the lazy
4911   // compilation stub.
4912   static void MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate);
4913   static void MarkCodeAsExecuted(byte* sequence, Isolate* isolate);
4914   void MakeYoung(Isolate* isolate);
4915   void MarkToBeExecutedOnce(Isolate* isolate);
4916   void MakeOlder(MarkingParity);
4917   static bool IsYoungSequence(Isolate* isolate, byte* sequence);
4918   bool IsOld();
4919   Age GetAge();
4920   static inline Code* GetPreAgedCodeAgeStub(Isolate* isolate) {
4921     return GetCodeAgeStub(isolate, kNotExecutedCodeAge, NO_MARKING_PARITY);
4922   }
4923
4924   void PrintDeoptLocation(FILE* out, Address pc);
4925   bool CanDeoptAt(Address pc);
4926
4927 #ifdef VERIFY_HEAP
4928   void VerifyEmbeddedObjectsDependency();
4929 #endif
4930
4931 #ifdef DEBUG
4932   enum VerifyMode { kNoContextSpecificPointers, kNoContextRetainingPointers };
4933   void VerifyEmbeddedObjects(VerifyMode mode = kNoContextRetainingPointers);
4934   static void VerifyRecompiledCode(Code* old_code, Code* new_code);
4935 #endif  // DEBUG
4936
4937   inline bool CanContainWeakObjects();
4938
4939   inline bool IsWeakObject(Object* object);
4940
4941   static inline bool IsWeakObjectInOptimizedCode(Object* object);
4942
4943   static Handle<WeakCell> WeakCellFor(Handle<Code> code);
4944   WeakCell* CachedWeakCell();
4945
4946   // Max loop nesting marker used to postpose OSR. We don't take loop
4947   // nesting that is deeper than 5 levels into account.
4948   static const int kMaxLoopNestingMarker = 6;
4949
4950   static const int kConstantPoolSize =
4951       FLAG_enable_embedded_constant_pool ? kIntSize : 0;
4952
4953   // Layout description.
4954   static const int kRelocationInfoOffset = HeapObject::kHeaderSize;
4955   static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize;
4956   static const int kDeoptimizationDataOffset =
4957       kHandlerTableOffset + kPointerSize;
4958   // For FUNCTION kind, we store the type feedback info here.
4959   static const int kTypeFeedbackInfoOffset =
4960       kDeoptimizationDataOffset + kPointerSize;
4961   static const int kNextCodeLinkOffset = kTypeFeedbackInfoOffset + kPointerSize;
4962   static const int kGCMetadataOffset = kNextCodeLinkOffset + kPointerSize;
4963   static const int kInstructionSizeOffset = kGCMetadataOffset + kPointerSize;
4964   static const int kICAgeOffset = kInstructionSizeOffset + kIntSize;
4965   static const int kFlagsOffset = kICAgeOffset + kIntSize;
4966   static const int kKindSpecificFlags1Offset = kFlagsOffset + kIntSize;
4967   static const int kKindSpecificFlags2Offset =
4968       kKindSpecificFlags1Offset + kIntSize;
4969   // Note: We might be able to squeeze this into the flags above.
4970   static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize;
4971   static const int kConstantPoolOffset = kPrologueOffset + kIntSize;
4972   static const int kHeaderPaddingStart =
4973       kConstantPoolOffset + kConstantPoolSize;
4974
4975   // Add padding to align the instruction start following right after
4976   // the Code object header.
4977   static const int kHeaderSize =
4978       (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask;
4979
4980   // Byte offsets within kKindSpecificFlags1Offset.
4981   static const int kFullCodeFlags = kKindSpecificFlags1Offset;
4982   class FullCodeFlagsHasDeoptimizationSupportField:
4983       public BitField<bool, 0, 1> {};  // NOLINT
4984   class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {};
4985   class FullCodeFlagsHasRelocInfoForSerialization
4986       : public BitField<bool, 2, 1> {};
4987   // Bit 3 in this bitfield is unused.
4988   class ProfilerTicksField : public BitField<int, 4, 28> {};
4989
4990   // Flags layout.  BitField<type, shift, size>.
4991   class ICStateField : public BitField<InlineCacheState, 0, 4> {};
4992   class TypeField : public BitField<StubType, 4, 1> {};
4993   class CacheHolderField : public BitField<CacheHolderFlag, 5, 2> {};
4994   class KindField : public BitField<Kind, 7, 4> {};
4995   class ExtraICStateField: public BitField<ExtraICState, 11,
4996       PlatformSmiTagging::kSmiValueSize - 11 + 1> {};  // NOLINT
4997
4998   // KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION)
4999   static const int kStackSlotsFirstBit = 0;
5000   static const int kStackSlotsBitCount = 24;
5001   static const int kHasFunctionCacheBit =
5002       kStackSlotsFirstBit + kStackSlotsBitCount;
5003   static const int kMarkedForDeoptimizationBit = kHasFunctionCacheBit + 1;
5004   static const int kIsTurbofannedBit = kMarkedForDeoptimizationBit + 1;
5005   static const int kCanHaveWeakObjects = kIsTurbofannedBit + 1;
5006
5007   STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32);
5008   STATIC_ASSERT(kCanHaveWeakObjects + 1 <= 32);
5009
5010   class StackSlotsField: public BitField<int,
5011       kStackSlotsFirstBit, kStackSlotsBitCount> {};  // NOLINT
5012   class HasFunctionCacheField : public BitField<bool, kHasFunctionCacheBit, 1> {
5013   };  // NOLINT
5014   class MarkedForDeoptimizationField
5015       : public BitField<bool, kMarkedForDeoptimizationBit, 1> {};   // NOLINT
5016   class IsTurbofannedField : public BitField<bool, kIsTurbofannedBit, 1> {
5017   };  // NOLINT
5018   class CanHaveWeakObjectsField
5019       : public BitField<bool, kCanHaveWeakObjects, 1> {};  // NOLINT
5020
5021   // KindSpecificFlags2 layout (ALL)
5022   static const int kIsCrankshaftedBit = 0;
5023   class IsCrankshaftedField: public BitField<bool,
5024       kIsCrankshaftedBit, 1> {};  // NOLINT
5025
5026   // KindSpecificFlags2 layout (STUB and OPTIMIZED_FUNCTION)
5027   static const int kSafepointTableOffsetFirstBit = kIsCrankshaftedBit + 1;
5028   static const int kSafepointTableOffsetBitCount = 30;
5029
5030   STATIC_ASSERT(kSafepointTableOffsetFirstBit +
5031                 kSafepointTableOffsetBitCount <= 32);
5032   STATIC_ASSERT(1 + kSafepointTableOffsetBitCount <= 32);
5033
5034   class SafepointTableOffsetField: public BitField<int,
5035       kSafepointTableOffsetFirstBit,
5036       kSafepointTableOffsetBitCount> {};  // NOLINT
5037
5038   // KindSpecificFlags2 layout (FUNCTION)
5039   class BackEdgeTableOffsetField: public BitField<int,
5040       kIsCrankshaftedBit + 1, 27> {};  // NOLINT
5041   class AllowOSRAtLoopNestingLevelField: public BitField<int,
5042       kIsCrankshaftedBit + 1 + 27, 4> {};  // NOLINT
5043   STATIC_ASSERT(AllowOSRAtLoopNestingLevelField::kMax >= kMaxLoopNestingMarker);
5044
5045   static const int kArgumentsBits = 16;
5046   static const int kMaxArguments = (1 << kArgumentsBits) - 1;
5047
5048   // This constant should be encodable in an ARM instruction.
5049   static const int kFlagsNotUsedInLookup =
5050       TypeField::kMask | CacheHolderField::kMask;
5051
5052  private:
5053   friend class RelocIterator;
5054   friend class Deoptimizer;  // For FindCodeAgeSequence.
5055
5056   void ClearInlineCaches(Kind* kind);
5057
5058   // Code aging
5059   byte* FindCodeAgeSequence();
5060   static void GetCodeAgeAndParity(Code* code, Age* age,
5061                                   MarkingParity* parity);
5062   static void GetCodeAgeAndParity(Isolate* isolate, byte* sequence, Age* age,
5063                                   MarkingParity* parity);
5064   static Code* GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity);
5065
5066   // Code aging -- platform-specific
5067   static void PatchPlatformCodeAge(Isolate* isolate,
5068                                    byte* sequence, Age age,
5069                                    MarkingParity parity);
5070
5071   DISALLOW_IMPLICIT_CONSTRUCTORS(Code);
5072 };
5073
5074
5075 // This class describes the layout of dependent codes array of a map. The
5076 // array is partitioned into several groups of dependent codes. Each group
5077 // contains codes with the same dependency on the map. The array has the
5078 // following layout for n dependency groups:
5079 //
5080 // +----+----+-----+----+---------+----------+-----+---------+-----------+
5081 // | C1 | C2 | ... | Cn | group 1 |  group 2 | ... | group n | undefined |
5082 // +----+----+-----+----+---------+----------+-----+---------+-----------+
5083 //
5084 // The first n elements are Smis, each of them specifies the number of codes
5085 // in the corresponding group. The subsequent elements contain grouped code
5086 // objects in weak cells. The suffix of the array can be filled with the
5087 // undefined value if the number of codes is less than the length of the
5088 // array. The order of the code objects within a group is not preserved.
5089 //
5090 // All code indexes used in the class are counted starting from the first
5091 // code object of the first group. In other words, code index 0 corresponds
5092 // to array index n = kCodesStartIndex.
5093
5094 class DependentCode: public FixedArray {
5095  public:
5096   enum DependencyGroup {
5097     // Group of code that weakly embed this map and depend on being
5098     // deoptimized when the map is garbage collected.
5099     kWeakCodeGroup,
5100     // Group of code that embed a transition to this map, and depend on being
5101     // deoptimized when the transition is replaced by a new version.
5102     kTransitionGroup,
5103     // Group of code that omit run-time prototype checks for prototypes
5104     // described by this map. The group is deoptimized whenever an object
5105     // described by this map changes shape (and transitions to a new map),
5106     // possibly invalidating the assumptions embedded in the code.
5107     kPrototypeCheckGroup,
5108     // Group of code that depends on global property values in property cells
5109     // not being changed.
5110     kPropertyCellChangedGroup,
5111     // Group of code that omit run-time type checks for the field(s) introduced
5112     // by this map.
5113     kFieldTypeGroup,
5114     // Group of code that omit run-time type checks for initial maps of
5115     // constructors.
5116     kInitialMapChangedGroup,
5117     // Group of code that depends on tenuring information in AllocationSites
5118     // not being changed.
5119     kAllocationSiteTenuringChangedGroup,
5120     // Group of code that depends on element transition information in
5121     // AllocationSites not being changed.
5122     kAllocationSiteTransitionChangedGroup
5123   };
5124
5125   static const int kGroupCount = kAllocationSiteTransitionChangedGroup + 1;
5126
5127   // Array for holding the index of the first code object of each group.
5128   // The last element stores the total number of code objects.
5129   class GroupStartIndexes {
5130    public:
5131     explicit GroupStartIndexes(DependentCode* entries);
5132     void Recompute(DependentCode* entries);
5133     int at(int i) { return start_indexes_[i]; }
5134     int number_of_entries() { return start_indexes_[kGroupCount]; }
5135    private:
5136     int start_indexes_[kGroupCount + 1];
5137   };
5138
5139   bool Contains(DependencyGroup group, WeakCell* code_cell);
5140
5141   static Handle<DependentCode> InsertCompilationDependencies(
5142       Handle<DependentCode> entries, DependencyGroup group,
5143       Handle<Foreign> info);
5144
5145   static Handle<DependentCode> InsertWeakCode(Handle<DependentCode> entries,
5146                                               DependencyGroup group,
5147                                               Handle<WeakCell> code_cell);
5148
5149   void UpdateToFinishedCode(DependencyGroup group, Foreign* info,
5150                             WeakCell* code_cell);
5151
5152   void RemoveCompilationDependencies(DependentCode::DependencyGroup group,
5153                                      Foreign* info);
5154
5155   void DeoptimizeDependentCodeGroup(Isolate* isolate,
5156                                     DependentCode::DependencyGroup group);
5157
5158   bool MarkCodeForDeoptimization(Isolate* isolate,
5159                                  DependentCode::DependencyGroup group);
5160
5161   // The following low-level accessors should only be used by this class
5162   // and the mark compact collector.
5163   inline int number_of_entries(DependencyGroup group);
5164   inline void set_number_of_entries(DependencyGroup group, int value);
5165   inline Object* object_at(int i);
5166   inline void set_object_at(int i, Object* object);
5167   inline void clear_at(int i);
5168   inline void copy(int from, int to);
5169   DECLARE_CAST(DependentCode)
5170
5171   static const char* DependencyGroupName(DependencyGroup group);
5172   static void SetMarkedForDeoptimization(Code* code, DependencyGroup group);
5173
5174  private:
5175   static Handle<DependentCode> Insert(Handle<DependentCode> entries,
5176                                       DependencyGroup group,
5177                                       Handle<Object> object);
5178   static Handle<DependentCode> EnsureSpace(Handle<DependentCode> entries);
5179   // Make a room at the end of the given group by moving out the first
5180   // code objects of the subsequent groups.
5181   inline void ExtendGroup(DependencyGroup group);
5182   // Compact by removing cleared weak cells and return true if there was
5183   // any cleared weak cell.
5184   bool Compact();
5185   static int Grow(int number_of_entries) {
5186     if (number_of_entries < 5) return number_of_entries + 1;
5187     return number_of_entries * 5 / 4;
5188   }
5189   static const int kCodesStartIndex = kGroupCount;
5190 };
5191
5192
5193 class PrototypeInfo;
5194
5195
5196 // All heap objects have a Map that describes their structure.
5197 //  A Map contains information about:
5198 //  - Size information about the object
5199 //  - How to iterate over an object (for garbage collection)
5200 class Map: public HeapObject {
5201  public:
5202   // Instance size.
5203   // Size in bytes or kVariableSizeSentinel if instances do not have
5204   // a fixed size.
5205   inline int instance_size();
5206   inline void set_instance_size(int value);
5207
5208   // Only to clear an unused byte, remove once byte is used.
5209   inline void clear_unused();
5210
5211   // [inobject_properties_or_constructor_function_index]: Provides access
5212   // to the inobject properties in case of JSObject maps, or the constructor
5213   // function index in case of primitive maps.
5214   inline int inobject_properties_or_constructor_function_index();
5215   inline void set_inobject_properties_or_constructor_function_index(int value);
5216   // Count of properties allocated in the object (JSObject only).
5217   inline int GetInObjectProperties();
5218   inline void SetInObjectProperties(int value);
5219   // Index of the constructor function in the native context (primitives only),
5220   // or the special sentinel value to indicate that there is no object wrapper
5221   // for the primitive (i.e. in case of null or undefined).
5222   static const int kNoConstructorFunctionIndex = 0;
5223   inline int GetConstructorFunctionIndex();
5224   inline void SetConstructorFunctionIndex(int value);
5225
5226   // Instance type.
5227   inline InstanceType instance_type();
5228   inline void set_instance_type(InstanceType value);
5229
5230   // Tells how many unused property fields are available in the
5231   // instance (only used for JSObject in fast mode).
5232   inline int unused_property_fields();
5233   inline void set_unused_property_fields(int value);
5234
5235   // Bit field.
5236   inline byte bit_field() const;
5237   inline void set_bit_field(byte value);
5238
5239   // Bit field 2.
5240   inline byte bit_field2() const;
5241   inline void set_bit_field2(byte value);
5242
5243   // Bit field 3.
5244   inline uint32_t bit_field3() const;
5245   inline void set_bit_field3(uint32_t bits);
5246
5247   class EnumLengthBits:             public BitField<int,
5248       0, kDescriptorIndexBitCount> {};  // NOLINT
5249   class NumberOfOwnDescriptorsBits: public BitField<int,
5250       kDescriptorIndexBitCount, kDescriptorIndexBitCount> {};  // NOLINT
5251   STATIC_ASSERT(kDescriptorIndexBitCount + kDescriptorIndexBitCount == 20);
5252   class DictionaryMap : public BitField<bool, 20, 1> {};
5253   class OwnsDescriptors : public BitField<bool, 21, 1> {};
5254   class IsHiddenPrototype : public BitField<bool, 22, 1> {};
5255   class Deprecated : public BitField<bool, 23, 1> {};
5256   class IsUnstable : public BitField<bool, 24, 1> {};
5257   class IsMigrationTarget : public BitField<bool, 25, 1> {};
5258   class IsStrong : public BitField<bool, 26, 1> {};
5259   // Bit 27 is free.
5260
5261   // Keep this bit field at the very end for better code in
5262   // Builtins::kJSConstructStubGeneric stub.
5263   // This counter is used for in-object slack tracking and for map aging.
5264   // The in-object slack tracking is considered enabled when the counter is
5265   // in the range [kSlackTrackingCounterStart, kSlackTrackingCounterEnd].
5266   class Counter : public BitField<int, 28, 4> {};
5267   static const int kSlackTrackingCounterStart = 14;
5268   static const int kSlackTrackingCounterEnd = 8;
5269   static const int kRetainingCounterStart = kSlackTrackingCounterEnd - 1;
5270   static const int kRetainingCounterEnd = 0;
5271
5272   // Tells whether the object in the prototype property will be used
5273   // for instances created from this function.  If the prototype
5274   // property is set to a value that is not a JSObject, the prototype
5275   // property will not be used to create instances of the function.
5276   // See ECMA-262, 13.2.2.
5277   inline void set_non_instance_prototype(bool value);
5278   inline bool has_non_instance_prototype();
5279
5280   // Tells whether function has special prototype property. If not, prototype
5281   // property will not be created when accessed (will return undefined),
5282   // and construction from this function will not be allowed.
5283   inline void set_function_with_prototype(bool value);
5284   inline bool function_with_prototype();
5285
5286   // Tells whether the instance with this map should be ignored by the
5287   // Object.getPrototypeOf() function and the __proto__ accessor.
5288   inline void set_is_hidden_prototype();
5289   inline bool is_hidden_prototype() const;
5290
5291   // Records and queries whether the instance has a named interceptor.
5292   inline void set_has_named_interceptor();
5293   inline bool has_named_interceptor();
5294
5295   // Records and queries whether the instance has an indexed interceptor.
5296   inline void set_has_indexed_interceptor();
5297   inline bool has_indexed_interceptor();
5298
5299   // Tells whether the instance is undetectable.
5300   // An undetectable object is a special class of JSObject: 'typeof' operator
5301   // returns undefined, ToBoolean returns false. Otherwise it behaves like
5302   // a normal JS object.  It is useful for implementing undetectable
5303   // document.all in Firefox & Safari.
5304   // See https://bugzilla.mozilla.org/show_bug.cgi?id=248549.
5305   inline void set_is_undetectable();
5306   inline bool is_undetectable();
5307
5308   // Tells whether the instance has a call-as-function handler.
5309   inline void set_is_observed();
5310   inline bool is_observed();
5311
5312   // Tells whether the instance has a [[Call]] internal field.
5313   // This property is implemented according to ES6, section 7.2.3.
5314   inline void set_is_callable();
5315   inline bool is_callable() const;
5316
5317   inline void set_is_strong();
5318   inline bool is_strong();
5319   inline void set_is_extensible(bool value);
5320   inline bool is_extensible();
5321   inline void set_is_prototype_map(bool value);
5322   inline bool is_prototype_map() const;
5323
5324   inline void set_elements_kind(ElementsKind elements_kind);
5325   inline ElementsKind elements_kind();
5326
5327   // Tells whether the instance has fast elements that are only Smis.
5328   inline bool has_fast_smi_elements();
5329
5330   // Tells whether the instance has fast elements.
5331   inline bool has_fast_object_elements();
5332   inline bool has_fast_smi_or_object_elements();
5333   inline bool has_fast_double_elements();
5334   inline bool has_fast_elements();
5335   inline bool has_sloppy_arguments_elements();
5336   inline bool has_fixed_typed_array_elements();
5337   inline bool has_dictionary_elements();
5338
5339   static bool IsValidElementsTransition(ElementsKind from_kind,
5340                                         ElementsKind to_kind);
5341
5342   // Returns true if the current map doesn't have DICTIONARY_ELEMENTS but if a
5343   // map with DICTIONARY_ELEMENTS was found in the prototype chain.
5344   bool DictionaryElementsInPrototypeChainOnly();
5345
5346   inline Map* ElementsTransitionMap();
5347
5348   inline FixedArrayBase* GetInitialElements();
5349
5350   // [raw_transitions]: Provides access to the transitions storage field.
5351   // Don't call set_raw_transitions() directly to overwrite transitions, use
5352   // the TransitionArray::ReplaceTransitions() wrapper instead!
5353   DECL_ACCESSORS(raw_transitions, Object)
5354   // [prototype_info]: Per-prototype metadata. Aliased with transitions
5355   // (which prototype maps don't have).
5356   DECL_ACCESSORS(prototype_info, Object)
5357   // PrototypeInfo is created lazily using this helper (which installs it on
5358   // the given prototype's map).
5359   static Handle<PrototypeInfo> GetOrCreatePrototypeInfo(
5360       Handle<JSObject> prototype, Isolate* isolate);
5361   static Handle<PrototypeInfo> GetOrCreatePrototypeInfo(
5362       Handle<Map> prototype_map, Isolate* isolate);
5363
5364   // [prototype chain validity cell]: Associated with a prototype object,
5365   // stored in that object's map's PrototypeInfo, indicates that prototype
5366   // chains through this object are currently valid. The cell will be
5367   // invalidated and replaced when the prototype chain changes.
5368   static Handle<Cell> GetOrCreatePrototypeChainValidityCell(Handle<Map> map,
5369                                                             Isolate* isolate);
5370   static const int kPrototypeChainValid = 0;
5371   static const int kPrototypeChainInvalid = 1;
5372
5373   Map* FindRootMap();
5374   Map* FindFieldOwner(int descriptor);
5375
5376   inline int GetInObjectPropertyOffset(int index);
5377
5378   int NumberOfFields();
5379
5380   // TODO(ishell): candidate with JSObject::MigrateToMap().
5381   bool InstancesNeedRewriting(Map* target, int target_number_of_fields,
5382                               int target_inobject, int target_unused,
5383                               int* old_number_of_fields);
5384   // TODO(ishell): moveit!
5385   static Handle<Map> GeneralizeAllFieldRepresentations(Handle<Map> map);
5386   MUST_USE_RESULT static Handle<HeapType> GeneralizeFieldType(
5387       Handle<HeapType> type1,
5388       Handle<HeapType> type2,
5389       Isolate* isolate);
5390   static void GeneralizeFieldType(Handle<Map> map, int modify_index,
5391                                   Representation new_representation,
5392                                   Handle<HeapType> new_field_type);
5393   static Handle<Map> ReconfigureProperty(Handle<Map> map, int modify_index,
5394                                          PropertyKind new_kind,
5395                                          PropertyAttributes new_attributes,
5396                                          Representation new_representation,
5397                                          Handle<HeapType> new_field_type,
5398                                          StoreMode store_mode);
5399   static Handle<Map> CopyGeneralizeAllRepresentations(
5400       Handle<Map> map, int modify_index, StoreMode store_mode,
5401       PropertyKind kind, PropertyAttributes attributes, const char* reason);
5402
5403   static Handle<Map> PrepareForDataProperty(Handle<Map> old_map,
5404                                             int descriptor_number,
5405                                             Handle<Object> value);
5406
5407   static Handle<Map> Normalize(Handle<Map> map, PropertyNormalizationMode mode,
5408                                const char* reason);
5409
5410   // Returns the constructor name (the name (possibly, inferred name) of the
5411   // function that was used to instantiate the object).
5412   String* constructor_name();
5413
5414   // Tells whether the map is used for JSObjects in dictionary mode (ie
5415   // normalized objects, ie objects for which HasFastProperties returns false).
5416   // A map can never be used for both dictionary mode and fast mode JSObjects.
5417   // False by default and for HeapObjects that are not JSObjects.
5418   inline void set_dictionary_map(bool value);
5419   inline bool is_dictionary_map();
5420
5421   // Tells whether the instance needs security checks when accessing its
5422   // properties.
5423   inline void set_is_access_check_needed(bool access_check_needed);
5424   inline bool is_access_check_needed();
5425
5426   // Returns true if map has a non-empty stub code cache.
5427   inline bool has_code_cache();
5428
5429   // [prototype]: implicit prototype object.
5430   DECL_ACCESSORS(prototype, Object)
5431   // TODO(jkummerow): make set_prototype private.
5432   static void SetPrototype(
5433       Handle<Map> map, Handle<Object> prototype,
5434       PrototypeOptimizationMode proto_mode = FAST_PROTOTYPE);
5435
5436   // [constructor]: points back to the function responsible for this map.
5437   // The field overlaps with the back pointer. All maps in a transition tree
5438   // have the same constructor, so maps with back pointers can walk the
5439   // back pointer chain until they find the map holding their constructor.
5440   DECL_ACCESSORS(constructor_or_backpointer, Object)
5441   inline Object* GetConstructor() const;
5442   inline void SetConstructor(Object* constructor,
5443                              WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
5444   // [back pointer]: points back to the parent map from which a transition
5445   // leads to this map. The field overlaps with the constructor (see above).
5446   inline Object* GetBackPointer();
5447   inline void SetBackPointer(Object* value,
5448                              WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
5449
5450   // [instance descriptors]: describes the object.
5451   DECL_ACCESSORS(instance_descriptors, DescriptorArray)
5452
5453   // [layout descriptor]: describes the object layout.
5454   DECL_ACCESSORS(layout_descriptor, LayoutDescriptor)
5455   // |layout descriptor| accessor which can be used from GC.
5456   inline LayoutDescriptor* layout_descriptor_gc_safe();
5457   inline bool HasFastPointerLayout() const;
5458
5459   // |layout descriptor| accessor that is safe to call even when
5460   // FLAG_unbox_double_fields is disabled (in this case Map does not contain
5461   // |layout_descriptor| field at all).
5462   inline LayoutDescriptor* GetLayoutDescriptor();
5463
5464   inline void UpdateDescriptors(DescriptorArray* descriptors,
5465                                 LayoutDescriptor* layout_descriptor);
5466   inline void InitializeDescriptors(DescriptorArray* descriptors,
5467                                     LayoutDescriptor* layout_descriptor);
5468
5469   // [stub cache]: contains stubs compiled for this map.
5470   DECL_ACCESSORS(code_cache, Object)
5471
5472   // [dependent code]: list of optimized codes that weakly embed this map.
5473   DECL_ACCESSORS(dependent_code, DependentCode)
5474
5475   // [weak cell cache]: cache that stores a weak cell pointing to this map.
5476   DECL_ACCESSORS(weak_cell_cache, Object)
5477
5478   inline PropertyDetails GetLastDescriptorDetails();
5479
5480   inline int LastAdded();
5481
5482   inline int NumberOfOwnDescriptors();
5483   inline void SetNumberOfOwnDescriptors(int number);
5484
5485   inline Cell* RetrieveDescriptorsPointer();
5486
5487   inline int EnumLength();
5488   inline void SetEnumLength(int length);
5489
5490   inline bool owns_descriptors();
5491   inline void set_owns_descriptors(bool owns_descriptors);
5492   inline void mark_unstable();
5493   inline bool is_stable();
5494   inline void set_migration_target(bool value);
5495   inline bool is_migration_target();
5496   inline void set_counter(int value);
5497   inline int counter();
5498   inline void deprecate();
5499   inline bool is_deprecated();
5500   inline bool CanBeDeprecated();
5501   // Returns a non-deprecated version of the input. If the input was not
5502   // deprecated, it is directly returned. Otherwise, the non-deprecated version
5503   // is found by re-transitioning from the root of the transition tree using the
5504   // descriptor array of the map. Returns MaybeHandle<Map>() if no updated map
5505   // is found.
5506   static MaybeHandle<Map> TryUpdate(Handle<Map> map) WARN_UNUSED_RESULT;
5507
5508   // Returns a non-deprecated version of the input. This method may deprecate
5509   // existing maps along the way if encodings conflict. Not for use while
5510   // gathering type feedback. Use TryUpdate in those cases instead.
5511   static Handle<Map> Update(Handle<Map> map);
5512
5513   static Handle<Map> CopyDropDescriptors(Handle<Map> map);
5514   static Handle<Map> CopyInsertDescriptor(Handle<Map> map,
5515                                           Descriptor* descriptor,
5516                                           TransitionFlag flag);
5517
5518   MUST_USE_RESULT static MaybeHandle<Map> CopyWithField(
5519       Handle<Map> map,
5520       Handle<Name> name,
5521       Handle<HeapType> type,
5522       PropertyAttributes attributes,
5523       Representation representation,
5524       TransitionFlag flag);
5525
5526   MUST_USE_RESULT static MaybeHandle<Map> CopyWithConstant(
5527       Handle<Map> map,
5528       Handle<Name> name,
5529       Handle<Object> constant,
5530       PropertyAttributes attributes,
5531       TransitionFlag flag);
5532
5533   // Returns a new map with all transitions dropped from the given map and
5534   // the ElementsKind set.
5535   static Handle<Map> TransitionElementsTo(Handle<Map> map,
5536                                           ElementsKind to_kind);
5537
5538   static Handle<Map> AsElementsKind(Handle<Map> map, ElementsKind kind);
5539
5540   static Handle<Map> CopyAsElementsKind(Handle<Map> map,
5541                                         ElementsKind kind,
5542                                         TransitionFlag flag);
5543
5544   static Handle<Map> CopyForObserved(Handle<Map> map);
5545
5546   static Handle<Map> CopyForPreventExtensions(Handle<Map> map,
5547                                               PropertyAttributes attrs_to_add,
5548                                               Handle<Symbol> transition_marker,
5549                                               const char* reason);
5550
5551   static Handle<Map> FixProxy(Handle<Map> map, InstanceType type, int size);
5552
5553
5554   // Maximal number of fast properties. Used to restrict the number of map
5555   // transitions to avoid an explosion in the number of maps for objects used as
5556   // dictionaries.
5557   inline bool TooManyFastProperties(StoreFromKeyed store_mode);
5558   static Handle<Map> TransitionToDataProperty(Handle<Map> map,
5559                                               Handle<Name> name,
5560                                               Handle<Object> value,
5561                                               PropertyAttributes attributes,
5562                                               StoreFromKeyed store_mode);
5563   static Handle<Map> TransitionToAccessorProperty(
5564       Handle<Map> map, Handle<Name> name, AccessorComponent component,
5565       Handle<Object> accessor, PropertyAttributes attributes);
5566   static Handle<Map> ReconfigureExistingProperty(Handle<Map> map,
5567                                                  int descriptor,
5568                                                  PropertyKind kind,
5569                                                  PropertyAttributes attributes);
5570
5571   inline void AppendDescriptor(Descriptor* desc);
5572
5573   // Returns a copy of the map, prepared for inserting into the transition
5574   // tree (if the |map| owns descriptors then the new one will share
5575   // descriptors with |map|).
5576   static Handle<Map> CopyForTransition(Handle<Map> map, const char* reason);
5577
5578   // Returns a copy of the map, with all transitions dropped from the
5579   // instance descriptors.
5580   static Handle<Map> Copy(Handle<Map> map, const char* reason);
5581   static Handle<Map> Create(Isolate* isolate, int inobject_properties);
5582
5583   // Returns the next free property index (only valid for FAST MODE).
5584   int NextFreePropertyIndex();
5585
5586   // Returns the number of properties described in instance_descriptors
5587   // filtering out properties with the specified attributes.
5588   int NumberOfDescribedProperties(DescriptorFlag which = OWN_DESCRIPTORS,
5589                                   PropertyAttributes filter = NONE);
5590
5591   DECLARE_CAST(Map)
5592
5593   // Code cache operations.
5594
5595   // Clears the code cache.
5596   inline void ClearCodeCache(Heap* heap);
5597
5598   // Update code cache.
5599   static void UpdateCodeCache(Handle<Map> map,
5600                               Handle<Name> name,
5601                               Handle<Code> code);
5602
5603   // Extend the descriptor array of the map with the list of descriptors.
5604   // In case of duplicates, the latest descriptor is used.
5605   static void AppendCallbackDescriptors(Handle<Map> map,
5606                                         Handle<Object> descriptors);
5607
5608   static inline int SlackForArraySize(int old_size, int size_limit);
5609
5610   static void EnsureDescriptorSlack(Handle<Map> map, int slack);
5611
5612   // Returns the found code or undefined if absent.
5613   Object* FindInCodeCache(Name* name, Code::Flags flags);
5614
5615   // Returns the non-negative index of the code object if it is in the
5616   // cache and -1 otherwise.
5617   int IndexInCodeCache(Object* name, Code* code);
5618
5619   // Removes a code object from the code cache at the given index.
5620   void RemoveFromCodeCache(Name* name, Code* code, int index);
5621
5622   // Computes a hash value for this map, to be used in HashTables and such.
5623   int Hash();
5624
5625   // Returns the map that this map transitions to if its elements_kind
5626   // is changed to |elements_kind|, or NULL if no such map is cached yet.
5627   // |safe_to_add_transitions| is set to false if adding transitions is not
5628   // allowed.
5629   Map* LookupElementsTransitionMap(ElementsKind elements_kind);
5630
5631   // Returns the transitioned map for this map with the most generic
5632   // elements_kind that's found in |candidates|, or null handle if no match is
5633   // found at all.
5634   static Handle<Map> FindTransitionedMap(Handle<Map> map,
5635                                          MapHandleList* candidates);
5636
5637   inline bool CanTransition();
5638
5639   inline bool IsPrimitiveMap();
5640   inline bool IsJSObjectMap();
5641   inline bool IsJSArrayMap();
5642   inline bool IsStringMap();
5643   inline bool IsJSProxyMap();
5644   inline bool IsJSGlobalProxyMap();
5645   inline bool IsJSGlobalObjectMap();
5646   inline bool IsGlobalObjectMap();
5647
5648   inline bool CanOmitMapChecks();
5649
5650   static void AddDependentCode(Handle<Map> map,
5651                                DependentCode::DependencyGroup group,
5652                                Handle<Code> code);
5653
5654   bool IsMapInArrayPrototypeChain();
5655
5656   static Handle<WeakCell> WeakCellForMap(Handle<Map> map);
5657
5658   // Dispatched behavior.
5659   DECLARE_PRINTER(Map)
5660   DECLARE_VERIFIER(Map)
5661
5662 #ifdef VERIFY_HEAP
5663   void DictionaryMapVerify();
5664   void VerifyOmittedMapChecks();
5665 #endif
5666
5667   inline int visitor_id();
5668   inline void set_visitor_id(int visitor_id);
5669
5670   static Handle<Map> TransitionToPrototype(Handle<Map> map,
5671                                            Handle<Object> prototype,
5672                                            PrototypeOptimizationMode mode);
5673
5674   static const int kMaxPreAllocatedPropertyFields = 255;
5675
5676   // Layout description.
5677   static const int kInstanceSizesOffset = HeapObject::kHeaderSize;
5678   static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize;
5679   static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize;
5680   static const int kPrototypeOffset = kBitField3Offset + kPointerSize;
5681   static const int kConstructorOrBackPointerOffset =
5682       kPrototypeOffset + kPointerSize;
5683   // When there is only one transition, it is stored directly in this field;
5684   // otherwise a transition array is used.
5685   // For prototype maps, this slot is used to store this map's PrototypeInfo
5686   // struct.
5687   static const int kTransitionsOrPrototypeInfoOffset =
5688       kConstructorOrBackPointerOffset + kPointerSize;
5689   static const int kDescriptorsOffset =
5690       kTransitionsOrPrototypeInfoOffset + kPointerSize;
5691 #if V8_DOUBLE_FIELDS_UNBOXING
5692   static const int kLayoutDecriptorOffset = kDescriptorsOffset + kPointerSize;
5693   static const int kCodeCacheOffset = kLayoutDecriptorOffset + kPointerSize;
5694 #else
5695   static const int kLayoutDecriptorOffset = 1;  // Must not be ever accessed.
5696   static const int kCodeCacheOffset = kDescriptorsOffset + kPointerSize;
5697 #endif
5698   static const int kDependentCodeOffset = kCodeCacheOffset + kPointerSize;
5699   static const int kWeakCellCacheOffset = kDependentCodeOffset + kPointerSize;
5700   static const int kSize = kWeakCellCacheOffset + kPointerSize;
5701
5702   // Layout of pointer fields. Heap iteration code relies on them
5703   // being continuously allocated.
5704   static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset;
5705   static const int kPointerFieldsEndOffset = kSize;
5706
5707   // Byte offsets within kInstanceSizesOffset.
5708   static const int kInstanceSizeOffset = kInstanceSizesOffset + 0;
5709   static const int kInObjectPropertiesOrConstructorFunctionIndexByte = 1;
5710   static const int kInObjectPropertiesOrConstructorFunctionIndexOffset =
5711       kInstanceSizesOffset + kInObjectPropertiesOrConstructorFunctionIndexByte;
5712   // Note there is one byte available for use here.
5713   static const int kUnusedByte = 2;
5714   static const int kUnusedOffset = kInstanceSizesOffset + kUnusedByte;
5715   static const int kVisitorIdByte = 3;
5716   static const int kVisitorIdOffset = kInstanceSizesOffset + kVisitorIdByte;
5717
5718   // Byte offsets within kInstanceAttributesOffset attributes.
5719 #if V8_TARGET_LITTLE_ENDIAN
5720   // Order instance type and bit field together such that they can be loaded
5721   // together as a 16-bit word with instance type in the lower 8 bits regardless
5722   // of endianess. Also provide endian-independent offset to that 16-bit word.
5723   static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0;
5724   static const int kBitFieldOffset = kInstanceAttributesOffset + 1;
5725 #else
5726   static const int kBitFieldOffset = kInstanceAttributesOffset + 0;
5727   static const int kInstanceTypeOffset = kInstanceAttributesOffset + 1;
5728 #endif
5729   static const int kInstanceTypeAndBitFieldOffset =
5730       kInstanceAttributesOffset + 0;
5731   static const int kBitField2Offset = kInstanceAttributesOffset + 2;
5732   static const int kUnusedPropertyFieldsByte = 3;
5733   static const int kUnusedPropertyFieldsOffset = kInstanceAttributesOffset + 3;
5734
5735   STATIC_ASSERT(kInstanceTypeAndBitFieldOffset ==
5736                 Internals::kMapInstanceTypeAndBitFieldOffset);
5737
5738   // Bit positions for bit field.
5739   static const int kHasNonInstancePrototype = 0;
5740   static const int kIsCallable = 1;
5741   static const int kHasNamedInterceptor = 2;
5742   static const int kHasIndexedInterceptor = 3;
5743   static const int kIsUndetectable = 4;
5744   static const int kIsObserved = 5;
5745   static const int kIsAccessCheckNeeded = 6;
5746   class FunctionWithPrototype: public BitField<bool, 7,  1> {};
5747
5748   // Bit positions for bit field 2
5749   static const int kIsExtensible = 0;
5750   static const int kStringWrapperSafeForDefaultValueOf = 1;
5751   class IsPrototypeMapBits : public BitField<bool, 2, 1> {};
5752   class ElementsKindBits: public BitField<ElementsKind, 3, 5> {};
5753
5754   // Derived values from bit field 2
5755   static const int8_t kMaximumBitField2FastElementValue = static_cast<int8_t>(
5756       (FAST_ELEMENTS + 1) << Map::ElementsKindBits::kShift) - 1;
5757   static const int8_t kMaximumBitField2FastSmiElementValue =
5758       static_cast<int8_t>((FAST_SMI_ELEMENTS + 1) <<
5759                           Map::ElementsKindBits::kShift) - 1;
5760   static const int8_t kMaximumBitField2FastHoleyElementValue =
5761       static_cast<int8_t>((FAST_HOLEY_ELEMENTS + 1) <<
5762                           Map::ElementsKindBits::kShift) - 1;
5763   static const int8_t kMaximumBitField2FastHoleySmiElementValue =
5764       static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) <<
5765                           Map::ElementsKindBits::kShift) - 1;
5766
5767   typedef FixedBodyDescriptor<kPointerFieldsBeginOffset,
5768                               kPointerFieldsEndOffset,
5769                               kSize> BodyDescriptor;
5770
5771   // Compares this map to another to see if they describe equivalent objects.
5772   // If |mode| is set to CLEAR_INOBJECT_PROPERTIES, |other| is treated as if
5773   // it had exactly zero inobject properties.
5774   // The "shared" flags of both this map and |other| are ignored.
5775   bool EquivalentToForNormalization(Map* other, PropertyNormalizationMode mode);
5776
5777   // Returns true if given field is unboxed double.
5778   inline bool IsUnboxedDoubleField(FieldIndex index);
5779
5780 #if TRACE_MAPS
5781   static void TraceTransition(const char* what, Map* from, Map* to, Name* name);
5782   static void TraceAllTransitions(Map* map);
5783 #endif
5784
5785   static inline Handle<Map> CopyInstallDescriptorsForTesting(
5786       Handle<Map> map, int new_descriptor, Handle<DescriptorArray> descriptors,
5787       Handle<LayoutDescriptor> layout_descriptor);
5788
5789  private:
5790   static void ConnectTransition(Handle<Map> parent, Handle<Map> child,
5791                                 Handle<Name> name, SimpleTransitionFlag flag);
5792
5793   bool EquivalentToForTransition(Map* other);
5794   static Handle<Map> RawCopy(Handle<Map> map, int instance_size);
5795   static Handle<Map> ShareDescriptor(Handle<Map> map,
5796                                      Handle<DescriptorArray> descriptors,
5797                                      Descriptor* descriptor);
5798   static Handle<Map> CopyInstallDescriptors(
5799       Handle<Map> map, int new_descriptor, Handle<DescriptorArray> descriptors,
5800       Handle<LayoutDescriptor> layout_descriptor);
5801   static Handle<Map> CopyAddDescriptor(Handle<Map> map,
5802                                        Descriptor* descriptor,
5803                                        TransitionFlag flag);
5804   static Handle<Map> CopyReplaceDescriptors(
5805       Handle<Map> map, Handle<DescriptorArray> descriptors,
5806       Handle<LayoutDescriptor> layout_descriptor, TransitionFlag flag,
5807       MaybeHandle<Name> maybe_name, const char* reason,
5808       SimpleTransitionFlag simple_flag);
5809
5810   static Handle<Map> CopyReplaceDescriptor(Handle<Map> map,
5811                                            Handle<DescriptorArray> descriptors,
5812                                            Descriptor* descriptor,
5813                                            int index,
5814                                            TransitionFlag flag);
5815   static MUST_USE_RESULT MaybeHandle<Map> TryReconfigureExistingProperty(
5816       Handle<Map> map, int descriptor, PropertyKind kind,
5817       PropertyAttributes attributes, const char** reason);
5818
5819   static Handle<Map> CopyNormalized(Handle<Map> map,
5820                                     PropertyNormalizationMode mode);
5821
5822   // Fires when the layout of an object with a leaf map changes.
5823   // This includes adding transitions to the leaf map or changing
5824   // the descriptor array.
5825   inline void NotifyLeafMapLayoutChange();
5826
5827   void DeprecateTransitionTree();
5828   bool DeprecateTarget(PropertyKind kind, Name* key,
5829                        PropertyAttributes attributes,
5830                        DescriptorArray* new_descriptors,
5831                        LayoutDescriptor* new_layout_descriptor);
5832
5833   Map* FindLastMatchMap(int verbatim, int length, DescriptorArray* descriptors);
5834
5835   // Update field type of the given descriptor to new representation and new
5836   // type. The type must be prepared for storing in descriptor array:
5837   // it must be either a simple type or a map wrapped in a weak cell.
5838   void UpdateFieldType(int descriptor_number, Handle<Name> name,
5839                        Representation new_representation,
5840                        Handle<Object> new_wrapped_type);
5841
5842   void PrintReconfiguration(FILE* file, int modify_index, PropertyKind kind,
5843                             PropertyAttributes attributes);
5844   void PrintGeneralization(FILE* file,
5845                            const char* reason,
5846                            int modify_index,
5847                            int split,
5848                            int descriptors,
5849                            bool constant_to_field,
5850                            Representation old_representation,
5851                            Representation new_representation,
5852                            HeapType* old_field_type,
5853                            HeapType* new_field_type);
5854
5855   static const int kFastPropertiesSoftLimit = 12;
5856   static const int kMaxFastProperties = 128;
5857
5858   DISALLOW_IMPLICIT_CONSTRUCTORS(Map);
5859 };
5860
5861
5862 // An abstract superclass, a marker class really, for simple structure classes.
5863 // It doesn't carry much functionality but allows struct classes to be
5864 // identified in the type system.
5865 class Struct: public HeapObject {
5866  public:
5867   inline void InitializeBody(int object_size);
5868   DECLARE_CAST(Struct)
5869 };
5870
5871
5872 // A simple one-element struct, useful where smis need to be boxed.
5873 class Box : public Struct {
5874  public:
5875   // [value]: the boxed contents.
5876   DECL_ACCESSORS(value, Object)
5877
5878   DECLARE_CAST(Box)
5879
5880   // Dispatched behavior.
5881   DECLARE_PRINTER(Box)
5882   DECLARE_VERIFIER(Box)
5883
5884   static const int kValueOffset = HeapObject::kHeaderSize;
5885   static const int kSize = kValueOffset + kPointerSize;
5886
5887  private:
5888   DISALLOW_IMPLICIT_CONSTRUCTORS(Box);
5889 };
5890
5891
5892 // Container for metadata stored on each prototype map.
5893 class PrototypeInfo : public Struct {
5894  public:
5895   static const int UNREGISTERED = -1;
5896
5897   // [prototype_users]: WeakFixedArray containing maps using this prototype,
5898   // or Smi(0) if uninitialized.
5899   DECL_ACCESSORS(prototype_users, Object)
5900   // [registry_slot]: Slot in prototype's user registry where this user
5901   // is stored. Returns UNREGISTERED if this prototype has not been registered.
5902   inline int registry_slot() const;
5903   inline void set_registry_slot(int slot);
5904   // [validity_cell]: Cell containing the validity bit for prototype chains
5905   // going through this object, or Smi(0) if uninitialized.
5906   DECL_ACCESSORS(validity_cell, Object)
5907   // [constructor_name]: User-friendly name of the original constructor.
5908   DECL_ACCESSORS(constructor_name, Object)
5909
5910   DECLARE_CAST(PrototypeInfo)
5911
5912   // Dispatched behavior.
5913   DECLARE_PRINTER(PrototypeInfo)
5914   DECLARE_VERIFIER(PrototypeInfo)
5915
5916   static const int kPrototypeUsersOffset = HeapObject::kHeaderSize;
5917   static const int kRegistrySlotOffset = kPrototypeUsersOffset + kPointerSize;
5918   static const int kValidityCellOffset = kRegistrySlotOffset + kPointerSize;
5919   static const int kConstructorNameOffset = kValidityCellOffset + kPointerSize;
5920   static const int kSize = kConstructorNameOffset + kPointerSize;
5921
5922  private:
5923   DISALLOW_IMPLICIT_CONSTRUCTORS(PrototypeInfo);
5924 };
5925
5926
5927 // Pair used to store both a ScopeInfo and an extension object in the extension
5928 // slot of a block context. Needed in the rare case where a declaration block
5929 // scope (a "varblock" as used to desugar parameter destructuring) also contains
5930 // a sloppy direct eval. (In no other case both are needed at the same time.)
5931 class SloppyBlockWithEvalContextExtension : public Struct {
5932  public:
5933   // [scope_info]: Scope info.
5934   DECL_ACCESSORS(scope_info, ScopeInfo)
5935   // [extension]: Extension object.
5936   DECL_ACCESSORS(extension, JSObject)
5937
5938   DECLARE_CAST(SloppyBlockWithEvalContextExtension)
5939
5940   // Dispatched behavior.
5941   DECLARE_PRINTER(SloppyBlockWithEvalContextExtension)
5942   DECLARE_VERIFIER(SloppyBlockWithEvalContextExtension)
5943
5944   static const int kScopeInfoOffset = HeapObject::kHeaderSize;
5945   static const int kExtensionOffset = kScopeInfoOffset + kPointerSize;
5946   static const int kSize = kExtensionOffset + kPointerSize;
5947
5948  private:
5949   DISALLOW_IMPLICIT_CONSTRUCTORS(SloppyBlockWithEvalContextExtension);
5950 };
5951
5952
5953 // Script describes a script which has been added to the VM.
5954 class Script: public Struct {
5955  public:
5956   // Script types.
5957   enum Type {
5958     TYPE_NATIVE = 0,
5959     TYPE_EXTENSION = 1,
5960     TYPE_NORMAL = 2
5961   };
5962
5963   // Script compilation types.
5964   enum CompilationType {
5965     COMPILATION_TYPE_HOST = 0,
5966     COMPILATION_TYPE_EVAL = 1
5967   };
5968
5969   // Script compilation state.
5970   enum CompilationState {
5971     COMPILATION_STATE_INITIAL = 0,
5972     COMPILATION_STATE_COMPILED = 1
5973   };
5974
5975   // [source]: the script source.
5976   DECL_ACCESSORS(source, Object)
5977
5978   // [name]: the script name.
5979   DECL_ACCESSORS(name, Object)
5980
5981   // [id]: the script id.
5982   DECL_ACCESSORS(id, Smi)
5983
5984   // [line_offset]: script line offset in resource from where it was extracted.
5985   DECL_ACCESSORS(line_offset, Smi)
5986
5987   // [column_offset]: script column offset in resource from where it was
5988   // extracted.
5989   DECL_ACCESSORS(column_offset, Smi)
5990
5991   // [context_data]: context data for the context this script was compiled in.
5992   DECL_ACCESSORS(context_data, Object)
5993
5994   // [wrapper]: the wrapper cache.  This is either undefined or a WeakCell.
5995   DECL_ACCESSORS(wrapper, HeapObject)
5996
5997   // [type]: the script type.
5998   DECL_ACCESSORS(type, Smi)
5999
6000   // [line_ends]: FixedArray of line ends positions.
6001   DECL_ACCESSORS(line_ends, Object)
6002
6003   // [eval_from_shared]: for eval scripts the shared funcion info for the
6004   // function from which eval was called.
6005   DECL_ACCESSORS(eval_from_shared, Object)
6006
6007   // [eval_from_instructions_offset]: the instruction offset in the code for the
6008   // function from which eval was called where eval was called.
6009   DECL_ACCESSORS(eval_from_instructions_offset, Smi)
6010
6011   // [shared_function_infos]: weak fixed array containing all shared
6012   // function infos created from this script.
6013   DECL_ACCESSORS(shared_function_infos, Object)
6014
6015   // [flags]: Holds an exciting bitfield.
6016   DECL_ACCESSORS(flags, Smi)
6017
6018   // [source_url]: sourceURL from magic comment
6019   DECL_ACCESSORS(source_url, Object)
6020
6021   // [source_url]: sourceMappingURL magic comment
6022   DECL_ACCESSORS(source_mapping_url, Object)
6023
6024   // [compilation_type]: how the the script was compiled. Encoded in the
6025   // 'flags' field.
6026   inline CompilationType compilation_type();
6027   inline void set_compilation_type(CompilationType type);
6028
6029   // [compilation_state]: determines whether the script has already been
6030   // compiled. Encoded in the 'flags' field.
6031   inline CompilationState compilation_state();
6032   inline void set_compilation_state(CompilationState state);
6033
6034   // [hide_source]: determines whether the script source can be exposed as
6035   // function source. Encoded in the 'flags' field.
6036   inline bool hide_source();
6037   inline void set_hide_source(bool value);
6038
6039   // [origin_options]: optional attributes set by the embedder via ScriptOrigin,
6040   // and used by the embedder to make decisions about the script. V8 just passes
6041   // this through. Encoded in the 'flags' field.
6042   inline v8::ScriptOriginOptions origin_options();
6043   inline void set_origin_options(ScriptOriginOptions origin_options);
6044
6045   DECLARE_CAST(Script)
6046
6047   // If script source is an external string, check that the underlying
6048   // resource is accessible. Otherwise, always return true.
6049   inline bool HasValidSource();
6050
6051   // Convert code position into column number.
6052   static int GetColumnNumber(Handle<Script> script, int code_pos);
6053
6054   // Convert code position into (zero-based) line number.
6055   // The non-handlified version does not allocate, but may be much slower.
6056   static int GetLineNumber(Handle<Script> script, int code_pos);
6057   int GetLineNumber(int code_pos);
6058
6059   static Handle<Object> GetNameOrSourceURL(Handle<Script> script);
6060
6061   // Init line_ends array with code positions of line ends inside script source.
6062   static void InitLineEnds(Handle<Script> script);
6063
6064   // Get the JS object wrapping the given script; create it if none exists.
6065   static Handle<JSObject> GetWrapper(Handle<Script> script);
6066
6067   // Look through the list of existing shared function infos to find one
6068   // that matches the function literal.  Return empty handle if not found.
6069   MaybeHandle<SharedFunctionInfo> FindSharedFunctionInfo(FunctionLiteral* fun);
6070
6071   // Iterate over all script objects on the heap.
6072   class Iterator {
6073    public:
6074     explicit Iterator(Isolate* isolate);
6075     Script* Next();
6076
6077    private:
6078     WeakFixedArray::Iterator iterator_;
6079     DISALLOW_COPY_AND_ASSIGN(Iterator);
6080   };
6081
6082   // Dispatched behavior.
6083   DECLARE_PRINTER(Script)
6084   DECLARE_VERIFIER(Script)
6085
6086   static const int kSourceOffset = HeapObject::kHeaderSize;
6087   static const int kNameOffset = kSourceOffset + kPointerSize;
6088   static const int kLineOffsetOffset = kNameOffset + kPointerSize;
6089   static const int kColumnOffsetOffset = kLineOffsetOffset + kPointerSize;
6090   static const int kContextOffset = kColumnOffsetOffset + kPointerSize;
6091   static const int kWrapperOffset = kContextOffset + kPointerSize;
6092   static const int kTypeOffset = kWrapperOffset + kPointerSize;
6093   static const int kLineEndsOffset = kTypeOffset + kPointerSize;
6094   static const int kIdOffset = kLineEndsOffset + kPointerSize;
6095   static const int kEvalFromSharedOffset = kIdOffset + kPointerSize;
6096   static const int kEvalFrominstructionsOffsetOffset =
6097       kEvalFromSharedOffset + kPointerSize;
6098   static const int kSharedFunctionInfosOffset =
6099       kEvalFrominstructionsOffsetOffset + kPointerSize;
6100   static const int kFlagsOffset = kSharedFunctionInfosOffset + kPointerSize;
6101   static const int kSourceUrlOffset = kFlagsOffset + kPointerSize;
6102   static const int kSourceMappingUrlOffset = kSourceUrlOffset + kPointerSize;
6103   static const int kSize = kSourceMappingUrlOffset + kPointerSize;
6104
6105  private:
6106   int GetLineNumberWithArray(int code_pos);
6107
6108   // Bit positions in the flags field.
6109   static const int kCompilationTypeBit = 0;
6110   static const int kCompilationStateBit = 1;
6111   static const int kHideSourceBit = 2;
6112   static const int kOriginOptionsShift = 3;
6113   static const int kOriginOptionsSize = 3;
6114   static const int kOriginOptionsMask = ((1 << kOriginOptionsSize) - 1)
6115                                         << kOriginOptionsShift;
6116
6117   DISALLOW_IMPLICIT_CONSTRUCTORS(Script);
6118 };
6119
6120
6121 // List of builtin functions we want to identify to improve code
6122 // generation.
6123 //
6124 // Each entry has a name of a global object property holding an object
6125 // optionally followed by ".prototype", a name of a builtin function
6126 // on the object (the one the id is set for), and a label.
6127 //
6128 // Installation of ids for the selected builtin functions is handled
6129 // by the bootstrapper.
6130 #define FUNCTIONS_WITH_ID_LIST(V)                   \
6131   V(Array.prototype, indexOf, ArrayIndexOf)         \
6132   V(Array.prototype, lastIndexOf, ArrayLastIndexOf) \
6133   V(Array.prototype, push, ArrayPush)               \
6134   V(Array.prototype, pop, ArrayPop)                 \
6135   V(Array.prototype, shift, ArrayShift)             \
6136   V(Function.prototype, apply, FunctionApply)       \
6137   V(Function.prototype, call, FunctionCall)         \
6138   V(String.prototype, charCodeAt, StringCharCodeAt) \
6139   V(String.prototype, charAt, StringCharAt)         \
6140   V(String, fromCharCode, StringFromCharCode)       \
6141   V(Math, random, MathRandom)                       \
6142   V(Math, floor, MathFloor)                         \
6143   V(Math, round, MathRound)                         \
6144   V(Math, ceil, MathCeil)                           \
6145   V(Math, abs, MathAbs)                             \
6146   V(Math, log, MathLog)                             \
6147   V(Math, exp, MathExp)                             \
6148   V(Math, sqrt, MathSqrt)                           \
6149   V(Math, pow, MathPow)                             \
6150   V(Math, max, MathMax)                             \
6151   V(Math, min, MathMin)                             \
6152   V(Math, cos, MathCos)                             \
6153   V(Math, sin, MathSin)                             \
6154   V(Math, tan, MathTan)                             \
6155   V(Math, acos, MathAcos)                           \
6156   V(Math, asin, MathAsin)                           \
6157   V(Math, atan, MathAtan)                           \
6158   V(Math, atan2, MathAtan2)                         \
6159   V(Math, imul, MathImul)                           \
6160   V(Math, clz32, MathClz32)                         \
6161   V(Math, fround, MathFround)
6162
6163 #define ATOMIC_FUNCTIONS_WITH_ID_LIST(V) \
6164   V(Atomics, load, AtomicsLoad)          \
6165   V(Atomics, store, AtomicsStore)
6166
6167 enum BuiltinFunctionId {
6168   kArrayCode,
6169 #define DECLARE_FUNCTION_ID(ignored1, ignore2, name)    \
6170   k##name,
6171   FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID)
6172       ATOMIC_FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID)
6173 #undef DECLARE_FUNCTION_ID
6174   // Fake id for a special case of Math.pow. Note, it continues the
6175   // list of math functions.
6176   kMathPowHalf
6177 };
6178
6179
6180 // Result of searching in an optimized code map of a SharedFunctionInfo. Note
6181 // that both {code} and {literals} can be NULL to pass search result status.
6182 struct CodeAndLiterals {
6183   Code* code;            // Cached optimized code.
6184   FixedArray* literals;  // Cached literals array.
6185 };
6186
6187
6188 // SharedFunctionInfo describes the JSFunction information that can be
6189 // shared by multiple instances of the function.
6190 class SharedFunctionInfo: public HeapObject {
6191  public:
6192   // [name]: Function name.
6193   DECL_ACCESSORS(name, Object)
6194
6195   // [code]: Function code.
6196   DECL_ACCESSORS(code, Code)
6197   inline void ReplaceCode(Code* code);
6198
6199   // [optimized_code_map]: Map from native context to optimized code
6200   // and a shared literals array or Smi(0) if none.
6201   DECL_ACCESSORS(optimized_code_map, Object)
6202
6203   // Returns entry from optimized code map for specified context and OSR entry.
6204   // Note that {code == nullptr} indicates no matching entry has been found,
6205   // whereas {literals == nullptr} indicates the code is context-independent.
6206   CodeAndLiterals SearchOptimizedCodeMap(Context* native_context,
6207                                          BailoutId osr_ast_id);
6208
6209   // Clear optimized code map.
6210   void ClearOptimizedCodeMap();
6211
6212   // Removed a specific optimized code object from the optimized code map.
6213   void EvictFromOptimizedCodeMap(Code* optimized_code, const char* reason);
6214
6215   // Trims the optimized code map after entries have been removed.
6216   void TrimOptimizedCodeMap(int shrink_by);
6217
6218   // Add a new entry to the optimized code map for context-independent code.
6219   static void AddSharedCodeToOptimizedCodeMap(Handle<SharedFunctionInfo> shared,
6220                                               Handle<Code> code);
6221
6222   // Add a new entry to the optimized code map for context-dependent code.
6223   static void AddToOptimizedCodeMap(Handle<SharedFunctionInfo> shared,
6224                                     Handle<Context> native_context,
6225                                     Handle<Code> code,
6226                                     Handle<FixedArray> literals,
6227                                     BailoutId osr_ast_id);
6228
6229   // Set up the link between shared function info and the script. The shared
6230   // function info is added to the list on the script.
6231   static void SetScript(Handle<SharedFunctionInfo> shared,
6232                         Handle<Object> script_object);
6233
6234   // Layout description of the optimized code map.
6235   static const int kNextMapIndex = 0;
6236   static const int kSharedCodeIndex = 1;
6237   static const int kEntriesStart = 2;
6238   static const int kContextOffset = 0;
6239   static const int kCachedCodeOffset = 1;
6240   static const int kLiteralsOffset = 2;
6241   static const int kOsrAstIdOffset = 3;
6242   static const int kEntryLength = 4;
6243   static const int kInitialLength = kEntriesStart + kEntryLength;
6244
6245   // [scope_info]: Scope info.
6246   DECL_ACCESSORS(scope_info, ScopeInfo)
6247
6248   // [construct stub]: Code stub for constructing instances of this function.
6249   DECL_ACCESSORS(construct_stub, Code)
6250
6251   // Returns if this function has been compiled to native code yet.
6252   inline bool is_compiled();
6253
6254   // [length]: The function length - usually the number of declared parameters.
6255   // Use up to 2^30 parameters.
6256   inline int length() const;
6257   inline void set_length(int value);
6258
6259   // [internal formal parameter count]: The declared number of parameters.
6260   // For subclass constructors, also includes new.target.
6261   // The size of function's frame is internal_formal_parameter_count + 1.
6262   inline int internal_formal_parameter_count() const;
6263   inline void set_internal_formal_parameter_count(int value);
6264
6265   // Set the formal parameter count so the function code will be
6266   // called without using argument adaptor frames.
6267   inline void DontAdaptArguments();
6268
6269   // [expected_nof_properties]: Expected number of properties for the function.
6270   inline int expected_nof_properties() const;
6271   inline void set_expected_nof_properties(int value);
6272
6273   // [feedback_vector] - accumulates ast node feedback from full-codegen and
6274   // (increasingly) from crankshafted code where sufficient feedback isn't
6275   // available.
6276   DECL_ACCESSORS(feedback_vector, TypeFeedbackVector)
6277
6278   // Unconditionally clear the type feedback vector (including vector ICs).
6279   void ClearTypeFeedbackInfo();
6280
6281   // Clear the type feedback vector with a more subtle policy at GC time.
6282   void ClearTypeFeedbackInfoAtGCTime();
6283
6284 #if TRACE_MAPS
6285   // [unique_id] - For --trace-maps purposes, an identifier that's persistent
6286   // even if the GC moves this SharedFunctionInfo.
6287   inline int unique_id() const;
6288   inline void set_unique_id(int value);
6289 #endif
6290
6291   // [instance class name]: class name for instances.
6292   DECL_ACCESSORS(instance_class_name, Object)
6293
6294   // [function data]: This field holds some additional data for function.
6295   // Currently it has one of:
6296   //  - a FunctionTemplateInfo to make benefit the API [IsApiFunction()].
6297   //  - a Smi identifying a builtin function [HasBuiltinFunctionId()].
6298   //  - a BytecodeArray for the interpreter [HasBytecodeArray()].
6299   // In the long run we don't want all functions to have this field but
6300   // we can fix that when we have a better model for storing hidden data
6301   // on objects.
6302   DECL_ACCESSORS(function_data, Object)
6303
6304   inline bool IsApiFunction();
6305   inline FunctionTemplateInfo* get_api_func_data();
6306   inline bool HasBuiltinFunctionId();
6307   inline BuiltinFunctionId builtin_function_id();
6308   inline bool HasBytecodeArray();
6309   inline BytecodeArray* bytecode_array();
6310
6311   // [script info]: Script from which the function originates.
6312   DECL_ACCESSORS(script, Object)
6313
6314   // [num_literals]: Number of literals used by this function.
6315   inline int num_literals() const;
6316   inline void set_num_literals(int value);
6317
6318   // [start_position_and_type]: Field used to store both the source code
6319   // position, whether or not the function is a function expression,
6320   // and whether or not the function is a toplevel function. The two
6321   // least significants bit indicates whether the function is an
6322   // expression and the rest contains the source code position.
6323   inline int start_position_and_type() const;
6324   inline void set_start_position_and_type(int value);
6325
6326   // The function is subject to debugging if a debug info is attached.
6327   inline bool HasDebugInfo();
6328   inline DebugInfo* GetDebugInfo();
6329
6330   // A function has debug code if the compiled code has debug break slots.
6331   inline bool HasDebugCode();
6332
6333   // [debug info]: Debug information.
6334   DECL_ACCESSORS(debug_info, Object)
6335
6336   // [inferred name]: Name inferred from variable or property
6337   // assignment of this function. Used to facilitate debugging and
6338   // profiling of JavaScript code written in OO style, where almost
6339   // all functions are anonymous but are assigned to object
6340   // properties.
6341   DECL_ACCESSORS(inferred_name, String)
6342
6343   // The function's name if it is non-empty, otherwise the inferred name.
6344   String* DebugName();
6345
6346   // Position of the 'function' token in the script source.
6347   inline int function_token_position() const;
6348   inline void set_function_token_position(int function_token_position);
6349
6350   // Position of this function in the script source.
6351   inline int start_position() const;
6352   inline void set_start_position(int start_position);
6353
6354   // End position of this function in the script source.
6355   inline int end_position() const;
6356   inline void set_end_position(int end_position);
6357
6358   // Is this function a function expression in the source code.
6359   DECL_BOOLEAN_ACCESSORS(is_expression)
6360
6361   // Is this function a top-level function (scripts, evals).
6362   DECL_BOOLEAN_ACCESSORS(is_toplevel)
6363
6364   // Bit field containing various information collected by the compiler to
6365   // drive optimization.
6366   inline int compiler_hints() const;
6367   inline void set_compiler_hints(int value);
6368
6369   inline int ast_node_count() const;
6370   inline void set_ast_node_count(int count);
6371
6372   inline int profiler_ticks() const;
6373   inline void set_profiler_ticks(int ticks);
6374
6375   // Inline cache age is used to infer whether the function survived a context
6376   // disposal or not. In the former case we reset the opt_count.
6377   inline int ic_age();
6378   inline void set_ic_age(int age);
6379
6380   // Indicates if this function can be lazy compiled.
6381   // This is used to determine if we can safely flush code from a function
6382   // when doing GC if we expect that the function will no longer be used.
6383   DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation)
6384
6385   // Indicates if this function can be lazy compiled without a context.
6386   // This is used to determine if we can force compilation without reaching
6387   // the function through program execution but through other means (e.g. heap
6388   // iteration by the debugger).
6389   DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation_without_context)
6390
6391   // Indicates whether optimizations have been disabled for this
6392   // shared function info. If a function is repeatedly optimized or if
6393   // we cannot optimize the function we disable optimization to avoid
6394   // spending time attempting to optimize it again.
6395   DECL_BOOLEAN_ACCESSORS(optimization_disabled)
6396
6397   // Indicates the language mode.
6398   inline LanguageMode language_mode();
6399   inline void set_language_mode(LanguageMode language_mode);
6400
6401   // False if the function definitely does not allocate an arguments object.
6402   DECL_BOOLEAN_ACCESSORS(uses_arguments)
6403
6404   // Indicates that this function uses a super property (or an eval that may
6405   // use a super property).
6406   // This is needed to set up the [[HomeObject]] on the function instance.
6407   DECL_BOOLEAN_ACCESSORS(needs_home_object)
6408
6409   // True if the function has any duplicated parameter names.
6410   DECL_BOOLEAN_ACCESSORS(has_duplicate_parameters)
6411
6412   // Indicates whether the function is a native function.
6413   // These needs special treatment in .call and .apply since
6414   // null passed as the receiver should not be translated to the
6415   // global object.
6416   DECL_BOOLEAN_ACCESSORS(native)
6417
6418   // Indicate that this function should always be inlined in optimized code.
6419   DECL_BOOLEAN_ACCESSORS(force_inline)
6420
6421   // Indicates that the function was created by the Function function.
6422   // Though it's anonymous, toString should treat it as if it had the name
6423   // "anonymous".  We don't set the name itself so that the system does not
6424   // see a binding for it.
6425   DECL_BOOLEAN_ACCESSORS(name_should_print_as_anonymous)
6426
6427   // Indicates whether the function is a bound function created using
6428   // the bind function.
6429   DECL_BOOLEAN_ACCESSORS(bound)
6430
6431   // Indicates that the function is anonymous (the name field can be set
6432   // through the API, which does not change this flag).
6433   DECL_BOOLEAN_ACCESSORS(is_anonymous)
6434
6435   // Is this a function or top-level/eval code.
6436   DECL_BOOLEAN_ACCESSORS(is_function)
6437
6438   // Indicates that code for this function cannot be compiled with Crankshaft.
6439   DECL_BOOLEAN_ACCESSORS(dont_crankshaft)
6440
6441   // Indicates that code for this function cannot be flushed.
6442   DECL_BOOLEAN_ACCESSORS(dont_flush)
6443
6444   // Indicates that this function is a generator.
6445   DECL_BOOLEAN_ACCESSORS(is_generator)
6446
6447   // Indicates that this function is an arrow function.
6448   DECL_BOOLEAN_ACCESSORS(is_arrow)
6449
6450   // Indicates that this function is a concise method.
6451   DECL_BOOLEAN_ACCESSORS(is_concise_method)
6452
6453   // Indicates that this function is an accessor (getter or setter).
6454   DECL_BOOLEAN_ACCESSORS(is_accessor_function)
6455
6456   // Indicates that this function is a default constructor.
6457   DECL_BOOLEAN_ACCESSORS(is_default_constructor)
6458
6459   // Indicates that this function is an asm function.
6460   DECL_BOOLEAN_ACCESSORS(asm_function)
6461
6462   // Indicates that the the shared function info is deserialized from cache.
6463   DECL_BOOLEAN_ACCESSORS(deserialized)
6464
6465   // Indicates that the the shared function info has never been compiled before.
6466   DECL_BOOLEAN_ACCESSORS(never_compiled)
6467
6468   inline FunctionKind kind();
6469   inline void set_kind(FunctionKind kind);
6470
6471   // Indicates whether or not the code in the shared function support
6472   // deoptimization.
6473   inline bool has_deoptimization_support();
6474
6475   // Enable deoptimization support through recompiled code.
6476   void EnableDeoptimizationSupport(Code* recompiled);
6477
6478   // Disable (further) attempted optimization of all functions sharing this
6479   // shared function info.
6480   void DisableOptimization(BailoutReason reason);
6481
6482   inline BailoutReason disable_optimization_reason();
6483
6484   // Lookup the bailout ID and DCHECK that it exists in the non-optimized
6485   // code, returns whether it asserted (i.e., always true if assertions are
6486   // disabled).
6487   bool VerifyBailoutId(BailoutId id);
6488
6489   // [source code]: Source code for the function.
6490   bool HasSourceCode() const;
6491   Handle<Object> GetSourceCode();
6492
6493   // Number of times the function was optimized.
6494   inline int opt_count();
6495   inline void set_opt_count(int opt_count);
6496
6497   // Number of times the function was deoptimized.
6498   inline void set_deopt_count(int value);
6499   inline int deopt_count();
6500   inline void increment_deopt_count();
6501
6502   // Number of time we tried to re-enable optimization after it
6503   // was disabled due to high number of deoptimizations.
6504   inline void set_opt_reenable_tries(int value);
6505   inline int opt_reenable_tries();
6506
6507   inline void TryReenableOptimization();
6508
6509   // Stores deopt_count, opt_reenable_tries and ic_age as bit-fields.
6510   inline void set_counters(int value);
6511   inline int counters() const;
6512
6513   // Stores opt_count and bailout_reason as bit-fields.
6514   inline void set_opt_count_and_bailout_reason(int value);
6515   inline int opt_count_and_bailout_reason() const;
6516
6517   inline void set_disable_optimization_reason(BailoutReason reason);
6518
6519   // Tells whether this function should be subject to debugging.
6520   inline bool IsSubjectToDebugging();
6521
6522   // Whether this function is defined in native code or extensions.
6523   inline bool IsBuiltin();
6524
6525   // Check whether or not this function is inlineable.
6526   bool IsInlineable();
6527
6528   // Source size of this function.
6529   int SourceSize();
6530
6531   // Calculate the instance size.
6532   int CalculateInstanceSize();
6533
6534   // Calculate the number of in-object properties.
6535   int CalculateInObjectProperties();
6536
6537   inline bool has_simple_parameters();
6538
6539   // Initialize a SharedFunctionInfo from a parsed function literal.
6540   static void InitFromFunctionLiteral(Handle<SharedFunctionInfo> shared_info,
6541                                       FunctionLiteral* lit);
6542
6543   // Dispatched behavior.
6544   DECLARE_PRINTER(SharedFunctionInfo)
6545   DECLARE_VERIFIER(SharedFunctionInfo)
6546
6547   void ResetForNewContext(int new_ic_age);
6548
6549   // Iterate over all shared function infos that are created from a script.
6550   // That excludes shared function infos created for API functions and C++
6551   // builtins.
6552   class Iterator {
6553    public:
6554     explicit Iterator(Isolate* isolate);
6555     SharedFunctionInfo* Next();
6556
6557    private:
6558     bool NextScript();
6559
6560     Script::Iterator script_iterator_;
6561     WeakFixedArray::Iterator sfi_iterator_;
6562     DisallowHeapAllocation no_gc_;
6563     DISALLOW_COPY_AND_ASSIGN(Iterator);
6564   };
6565
6566   DECLARE_CAST(SharedFunctionInfo)
6567
6568   // Constants.
6569   static const int kDontAdaptArgumentsSentinel = -1;
6570
6571   // Layout description.
6572   // Pointer fields.
6573   static const int kNameOffset = HeapObject::kHeaderSize;
6574   static const int kCodeOffset = kNameOffset + kPointerSize;
6575   static const int kOptimizedCodeMapOffset = kCodeOffset + kPointerSize;
6576   static const int kScopeInfoOffset = kOptimizedCodeMapOffset + kPointerSize;
6577   static const int kConstructStubOffset = kScopeInfoOffset + kPointerSize;
6578   static const int kInstanceClassNameOffset =
6579       kConstructStubOffset + kPointerSize;
6580   static const int kFunctionDataOffset =
6581       kInstanceClassNameOffset + kPointerSize;
6582   static const int kScriptOffset = kFunctionDataOffset + kPointerSize;
6583   static const int kDebugInfoOffset = kScriptOffset + kPointerSize;
6584   static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize;
6585   static const int kFeedbackVectorOffset =
6586       kInferredNameOffset + kPointerSize;
6587 #if TRACE_MAPS
6588   static const int kUniqueIdOffset = kFeedbackVectorOffset + kPointerSize;
6589   static const int kLastPointerFieldOffset = kUniqueIdOffset;
6590 #else
6591   // Just to not break the postmortrem support with conditional offsets
6592   static const int kUniqueIdOffset = kFeedbackVectorOffset;
6593   static const int kLastPointerFieldOffset = kFeedbackVectorOffset;
6594 #endif
6595
6596 #if V8_HOST_ARCH_32_BIT
6597   // Smi fields.
6598   static const int kLengthOffset = kLastPointerFieldOffset + kPointerSize;
6599   static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize;
6600   static const int kExpectedNofPropertiesOffset =
6601       kFormalParameterCountOffset + kPointerSize;
6602   static const int kNumLiteralsOffset =
6603       kExpectedNofPropertiesOffset + kPointerSize;
6604   static const int kStartPositionAndTypeOffset =
6605       kNumLiteralsOffset + kPointerSize;
6606   static const int kEndPositionOffset =
6607       kStartPositionAndTypeOffset + kPointerSize;
6608   static const int kFunctionTokenPositionOffset =
6609       kEndPositionOffset + kPointerSize;
6610   static const int kCompilerHintsOffset =
6611       kFunctionTokenPositionOffset + kPointerSize;
6612   static const int kOptCountAndBailoutReasonOffset =
6613       kCompilerHintsOffset + kPointerSize;
6614   static const int kCountersOffset =
6615       kOptCountAndBailoutReasonOffset + kPointerSize;
6616   static const int kAstNodeCountOffset =
6617       kCountersOffset + kPointerSize;
6618   static const int kProfilerTicksOffset =
6619       kAstNodeCountOffset + kPointerSize;
6620
6621   // Total size.
6622   static const int kSize = kProfilerTicksOffset + kPointerSize;
6623 #else
6624   // The only reason to use smi fields instead of int fields
6625   // is to allow iteration without maps decoding during
6626   // garbage collections.
6627   // To avoid wasting space on 64-bit architectures we use
6628   // the following trick: we group integer fields into pairs
6629 // The least significant integer in each pair is shifted left by 1.
6630 // By doing this we guarantee that LSB of each kPointerSize aligned
6631 // word is not set and thus this word cannot be treated as pointer
6632 // to HeapObject during old space traversal.
6633 #if V8_TARGET_LITTLE_ENDIAN
6634   static const int kLengthOffset = kLastPointerFieldOffset + kPointerSize;
6635   static const int kFormalParameterCountOffset =
6636       kLengthOffset + kIntSize;
6637
6638   static const int kExpectedNofPropertiesOffset =
6639       kFormalParameterCountOffset + kIntSize;
6640   static const int kNumLiteralsOffset =
6641       kExpectedNofPropertiesOffset + kIntSize;
6642
6643   static const int kEndPositionOffset =
6644       kNumLiteralsOffset + kIntSize;
6645   static const int kStartPositionAndTypeOffset =
6646       kEndPositionOffset + kIntSize;
6647
6648   static const int kFunctionTokenPositionOffset =
6649       kStartPositionAndTypeOffset + kIntSize;
6650   static const int kCompilerHintsOffset =
6651       kFunctionTokenPositionOffset + kIntSize;
6652
6653   static const int kOptCountAndBailoutReasonOffset =
6654       kCompilerHintsOffset + kIntSize;
6655   static const int kCountersOffset =
6656       kOptCountAndBailoutReasonOffset + kIntSize;
6657
6658   static const int kAstNodeCountOffset =
6659       kCountersOffset + kIntSize;
6660   static const int kProfilerTicksOffset =
6661       kAstNodeCountOffset + kIntSize;
6662
6663   // Total size.
6664   static const int kSize = kProfilerTicksOffset + kIntSize;
6665
6666 #elif V8_TARGET_BIG_ENDIAN
6667   static const int kFormalParameterCountOffset =
6668       kLastPointerFieldOffset + kPointerSize;
6669   static const int kLengthOffset = kFormalParameterCountOffset + kIntSize;
6670
6671   static const int kNumLiteralsOffset = kLengthOffset + kIntSize;
6672   static const int kExpectedNofPropertiesOffset = kNumLiteralsOffset + kIntSize;
6673
6674   static const int kStartPositionAndTypeOffset =
6675       kExpectedNofPropertiesOffset + kIntSize;
6676   static const int kEndPositionOffset = kStartPositionAndTypeOffset + kIntSize;
6677
6678   static const int kCompilerHintsOffset = kEndPositionOffset + kIntSize;
6679   static const int kFunctionTokenPositionOffset =
6680       kCompilerHintsOffset + kIntSize;
6681
6682   static const int kCountersOffset = kFunctionTokenPositionOffset + kIntSize;
6683   static const int kOptCountAndBailoutReasonOffset = kCountersOffset + kIntSize;
6684
6685   static const int kProfilerTicksOffset =
6686       kOptCountAndBailoutReasonOffset + kIntSize;
6687   static const int kAstNodeCountOffset = kProfilerTicksOffset + kIntSize;
6688
6689   // Total size.
6690   static const int kSize = kAstNodeCountOffset + kIntSize;
6691
6692 #else
6693 #error Unknown byte ordering
6694 #endif  // Big endian
6695 #endif  // 64-bit
6696
6697
6698   static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize);
6699
6700   typedef FixedBodyDescriptor<kNameOffset,
6701                               kLastPointerFieldOffset + kPointerSize,
6702                               kSize> BodyDescriptor;
6703
6704   // Bit positions in start_position_and_type.
6705   // The source code start position is in the 30 most significant bits of
6706   // the start_position_and_type field.
6707   static const int kIsExpressionBit    = 0;
6708   static const int kIsTopLevelBit      = 1;
6709   static const int kStartPositionShift = 2;
6710   static const int kStartPositionMask  = ~((1 << kStartPositionShift) - 1);
6711
6712   // Bit positions in compiler_hints.
6713   enum CompilerHints {
6714     kAllowLazyCompilation,
6715     kAllowLazyCompilationWithoutContext,
6716     kOptimizationDisabled,
6717     kNative,
6718     kStrictModeFunction,
6719     kStrongModeFunction,
6720     kUsesArguments,
6721     kNeedsHomeObject,
6722     kHasDuplicateParameters,
6723     kForceInline,
6724     kBoundFunction,
6725     kIsAnonymous,
6726     kNameShouldPrintAsAnonymous,
6727     kIsFunction,
6728     kDontCrankshaft,
6729     kDontFlush,
6730     kIsArrow,
6731     kIsGenerator,
6732     kIsConciseMethod,
6733     kIsAccessorFunction,
6734     kIsDefaultConstructor,
6735     kIsSubclassConstructor,
6736     kIsBaseConstructor,
6737     kInClassLiteral,
6738     kIsAsmFunction,
6739     kDeserialized,
6740     kNeverCompiled,
6741     kCompilerHintsCount  // Pseudo entry
6742   };
6743   // Add hints for other modes when they're added.
6744   STATIC_ASSERT(LANGUAGE_END == 3);
6745
6746   class FunctionKindBits : public BitField<FunctionKind, kIsArrow, 8> {};
6747
6748   class DeoptCountBits : public BitField<int, 0, 4> {};
6749   class OptReenableTriesBits : public BitField<int, 4, 18> {};
6750   class ICAgeBits : public BitField<int, 22, 8> {};
6751
6752   class OptCountBits : public BitField<int, 0, 22> {};
6753   class DisabledOptimizationReasonBits : public BitField<int, 22, 8> {};
6754
6755  private:
6756 #if V8_HOST_ARCH_32_BIT
6757   // On 32 bit platforms, compiler hints is a smi.
6758   static const int kCompilerHintsSmiTagSize = kSmiTagSize;
6759   static const int kCompilerHintsSize = kPointerSize;
6760 #else
6761   // On 64 bit platforms, compiler hints is not a smi, see comment above.
6762   static const int kCompilerHintsSmiTagSize = 0;
6763   static const int kCompilerHintsSize = kIntSize;
6764 #endif
6765
6766   STATIC_ASSERT(SharedFunctionInfo::kCompilerHintsCount <=
6767                 SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte);
6768
6769  public:
6770   // Constants for optimizing codegen for strict mode function and
6771   // native tests.
6772   // Allows to use byte-width instructions.
6773   static const int kStrictModeBitWithinByte =
6774       (kStrictModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte;
6775   static const int kStrongModeBitWithinByte =
6776       (kStrongModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte;
6777
6778   static const int kNativeBitWithinByte =
6779       (kNative + kCompilerHintsSmiTagSize) % kBitsPerByte;
6780
6781   static const int kBoundBitWithinByte =
6782       (kBoundFunction + kCompilerHintsSmiTagSize) % kBitsPerByte;
6783
6784 #if defined(V8_TARGET_LITTLE_ENDIAN)
6785   static const int kStrictModeByteOffset = kCompilerHintsOffset +
6786       (kStrictModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte;
6787   static const int kStrongModeByteOffset =
6788       kCompilerHintsOffset +
6789       (kStrongModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte;
6790   static const int kNativeByteOffset = kCompilerHintsOffset +
6791       (kNative + kCompilerHintsSmiTagSize) / kBitsPerByte;
6792   static const int kBoundByteOffset =
6793       kCompilerHintsOffset +
6794       (kBoundFunction + kCompilerHintsSmiTagSize) / kBitsPerByte;
6795 #elif defined(V8_TARGET_BIG_ENDIAN)
6796   static const int kStrictModeByteOffset = kCompilerHintsOffset +
6797       (kCompilerHintsSize - 1) -
6798       ((kStrictModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte);
6799   static const int kStrongModeByteOffset =
6800       kCompilerHintsOffset + (kCompilerHintsSize - 1) -
6801       ((kStrongModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte);
6802   static const int kNativeByteOffset = kCompilerHintsOffset +
6803       (kCompilerHintsSize - 1) -
6804       ((kNative + kCompilerHintsSmiTagSize) / kBitsPerByte);
6805   static const int kBoundByteOffset =
6806       kCompilerHintsOffset + (kCompilerHintsSize - 1) -
6807       ((kBoundFunction + kCompilerHintsSmiTagSize) / kBitsPerByte);
6808 #else
6809 #error Unknown byte ordering
6810 #endif
6811
6812  private:
6813   DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo);
6814 };
6815
6816
6817 // Printing support.
6818 struct SourceCodeOf {
6819   explicit SourceCodeOf(SharedFunctionInfo* v, int max = -1)
6820       : value(v), max_length(max) {}
6821   const SharedFunctionInfo* value;
6822   int max_length;
6823 };
6824
6825
6826 std::ostream& operator<<(std::ostream& os, const SourceCodeOf& v);
6827
6828
6829 class JSGeneratorObject: public JSObject {
6830  public:
6831   // [function]: The function corresponding to this generator object.
6832   DECL_ACCESSORS(function, JSFunction)
6833
6834   // [context]: The context of the suspended computation.
6835   DECL_ACCESSORS(context, Context)
6836
6837   // [receiver]: The receiver of the suspended computation.
6838   DECL_ACCESSORS(receiver, Object)
6839
6840   // [continuation]: Offset into code of continuation.
6841   //
6842   // A positive offset indicates a suspended generator.  The special
6843   // kGeneratorExecuting and kGeneratorClosed values indicate that a generator
6844   // cannot be resumed.
6845   inline int continuation() const;
6846   inline void set_continuation(int continuation);
6847   inline bool is_closed();
6848   inline bool is_executing();
6849   inline bool is_suspended();
6850
6851   // [operand_stack]: Saved operand stack.
6852   DECL_ACCESSORS(operand_stack, FixedArray)
6853
6854   DECLARE_CAST(JSGeneratorObject)
6855
6856   // Dispatched behavior.
6857   DECLARE_PRINTER(JSGeneratorObject)
6858   DECLARE_VERIFIER(JSGeneratorObject)
6859
6860   // Magic sentinel values for the continuation.
6861   static const int kGeneratorExecuting = -1;
6862   static const int kGeneratorClosed = 0;
6863
6864   // Layout description.
6865   static const int kFunctionOffset = JSObject::kHeaderSize;
6866   static const int kContextOffset = kFunctionOffset + kPointerSize;
6867   static const int kReceiverOffset = kContextOffset + kPointerSize;
6868   static const int kContinuationOffset = kReceiverOffset + kPointerSize;
6869   static const int kOperandStackOffset = kContinuationOffset + kPointerSize;
6870   static const int kSize = kOperandStackOffset + kPointerSize;
6871
6872   // Resume mode, for use by runtime functions.
6873   enum ResumeMode { NEXT, THROW };
6874
6875  private:
6876   DISALLOW_IMPLICIT_CONSTRUCTORS(JSGeneratorObject);
6877 };
6878
6879
6880 // Representation for module instance objects.
6881 class JSModule: public JSObject {
6882  public:
6883   // [context]: the context holding the module's locals, or undefined if none.
6884   DECL_ACCESSORS(context, Object)
6885
6886   // [scope_info]: Scope info.
6887   DECL_ACCESSORS(scope_info, ScopeInfo)
6888
6889   DECLARE_CAST(JSModule)
6890
6891   // Dispatched behavior.
6892   DECLARE_PRINTER(JSModule)
6893   DECLARE_VERIFIER(JSModule)
6894
6895   // Layout description.
6896   static const int kContextOffset = JSObject::kHeaderSize;
6897   static const int kScopeInfoOffset = kContextOffset + kPointerSize;
6898   static const int kSize = kScopeInfoOffset + kPointerSize;
6899
6900  private:
6901   DISALLOW_IMPLICIT_CONSTRUCTORS(JSModule);
6902 };
6903
6904
6905 // JSFunction describes JavaScript functions.
6906 class JSFunction: public JSObject {
6907  public:
6908   // [prototype_or_initial_map]:
6909   DECL_ACCESSORS(prototype_or_initial_map, Object)
6910
6911   // [shared]: The information about the function that
6912   // can be shared by instances.
6913   DECL_ACCESSORS(shared, SharedFunctionInfo)
6914
6915   // [context]: The context for this function.
6916   inline Context* context();
6917   inline void set_context(Object* context);
6918   inline JSObject* global_proxy();
6919
6920   // [code]: The generated code object for this function.  Executed
6921   // when the function is invoked, e.g. foo() or new foo(). See
6922   // [[Call]] and [[Construct]] description in ECMA-262, section
6923   // 8.6.2, page 27.
6924   inline Code* code();
6925   inline void set_code(Code* code);
6926   inline void set_code_no_write_barrier(Code* code);
6927   inline void ReplaceCode(Code* code);
6928
6929   // Tells whether this function is builtin.
6930   inline bool IsBuiltin();
6931
6932   // Tells whether this function inlines the given shared function info.
6933   bool Inlines(SharedFunctionInfo* candidate);
6934
6935   // Tells whether this function should be subject to debugging.
6936   inline bool IsSubjectToDebugging();
6937
6938   // Tells whether or not the function needs arguments adaption.
6939   inline bool NeedsArgumentsAdaption();
6940
6941   // Tells whether or not this function has been optimized.
6942   inline bool IsOptimized();
6943
6944   // Mark this function for lazy recompilation. The function will be
6945   // recompiled the next time it is executed.
6946   void MarkForOptimization();
6947   void AttemptConcurrentOptimization();
6948
6949   // Tells whether or not the function is already marked for lazy
6950   // recompilation.
6951   inline bool IsMarkedForOptimization();
6952   inline bool IsMarkedForConcurrentOptimization();
6953
6954   // Tells whether or not the function is on the concurrent recompilation queue.
6955   inline bool IsInOptimizationQueue();
6956
6957   // Inobject slack tracking is the way to reclaim unused inobject space.
6958   //
6959   // The instance size is initially determined by adding some slack to
6960   // expected_nof_properties (to allow for a few extra properties added
6961   // after the constructor). There is no guarantee that the extra space
6962   // will not be wasted.
6963   //
6964   // Here is the algorithm to reclaim the unused inobject space:
6965   // - Detect the first constructor call for this JSFunction.
6966   //   When it happens enter the "in progress" state: initialize construction
6967   //   counter in the initial_map.
6968   // - While the tracking is in progress create objects filled with
6969   //   one_pointer_filler_map instead of undefined_value. This way they can be
6970   //   resized quickly and safely.
6971   // - Once enough objects have been created  compute the 'slack'
6972   //   (traverse the map transition tree starting from the
6973   //   initial_map and find the lowest value of unused_property_fields).
6974   // - Traverse the transition tree again and decrease the instance size
6975   //   of every map. Existing objects will resize automatically (they are
6976   //   filled with one_pointer_filler_map). All further allocations will
6977   //   use the adjusted instance size.
6978   // - SharedFunctionInfo's expected_nof_properties left unmodified since
6979   //   allocations made using different closures could actually create different
6980   //   kind of objects (see prototype inheritance pattern).
6981   //
6982   //  Important: inobject slack tracking is not attempted during the snapshot
6983   //  creation.
6984
6985   // True if the initial_map is set and the object constructions countdown
6986   // counter is not zero.
6987   static const int kGenerousAllocationCount =
6988       Map::kSlackTrackingCounterStart - Map::kSlackTrackingCounterEnd + 1;
6989   inline bool IsInobjectSlackTrackingInProgress();
6990
6991   // Starts the tracking.
6992   // Initializes object constructions countdown counter in the initial map.
6993   void StartInobjectSlackTracking();
6994
6995   // Completes the tracking.
6996   void CompleteInobjectSlackTracking();
6997
6998   // [literals_or_bindings]: Fixed array holding either
6999   // the materialized literals or the bindings of a bound function.
7000   //
7001   // If the function contains object, regexp or array literals, the
7002   // literals array prefix contains the object, regexp, and array
7003   // function to be used when creating these literals.  This is
7004   // necessary so that we do not dynamically lookup the object, regexp
7005   // or array functions.  Performing a dynamic lookup, we might end up
7006   // using the functions from a new context that we should not have
7007   // access to.
7008   //
7009   // On bound functions, the array is a (copy-on-write) fixed-array containing
7010   // the function that was bound, bound this-value and any bound
7011   // arguments. Bound functions never contain literals.
7012   DECL_ACCESSORS(literals_or_bindings, FixedArray)
7013
7014   inline FixedArray* literals();
7015   inline void set_literals(FixedArray* literals);
7016
7017   inline FixedArray* function_bindings();
7018   inline void set_function_bindings(FixedArray* bindings);
7019
7020   // The initial map for an object created by this constructor.
7021   inline Map* initial_map();
7022   static void SetInitialMap(Handle<JSFunction> function, Handle<Map> map,
7023                             Handle<Object> prototype);
7024   inline bool has_initial_map();
7025   static void EnsureHasInitialMap(Handle<JSFunction> function);
7026
7027   // Get and set the prototype property on a JSFunction. If the
7028   // function has an initial map the prototype is set on the initial
7029   // map. Otherwise, the prototype is put in the initial map field
7030   // until an initial map is needed.
7031   inline bool has_prototype();
7032   inline bool has_instance_prototype();
7033   inline Object* prototype();
7034   inline Object* instance_prototype();
7035   static void SetPrototype(Handle<JSFunction> function,
7036                            Handle<Object> value);
7037   static void SetInstancePrototype(Handle<JSFunction> function,
7038                                    Handle<Object> value);
7039
7040   // Creates a new closure for the fucntion with the same bindings,
7041   // bound values, and prototype. An equivalent of spec operations
7042   // ``CloneMethod`` and ``CloneBoundFunction``.
7043   static Handle<JSFunction> CloneClosure(Handle<JSFunction> function);
7044
7045   // After prototype is removed, it will not be created when accessed, and
7046   // [[Construct]] from this function will not be allowed.
7047   bool RemovePrototype();
7048   inline bool should_have_prototype();
7049
7050   // Accessor for this function's initial map's [[class]]
7051   // property. This is primarily used by ECMA native functions.  This
7052   // method sets the class_name field of this function's initial map
7053   // to a given value. It creates an initial map if this function does
7054   // not have one. Note that this method does not copy the initial map
7055   // if it has one already, but simply replaces it with the new value.
7056   // Instances created afterwards will have a map whose [[class]] is
7057   // set to 'value', but there is no guarantees on instances created
7058   // before.
7059   void SetInstanceClassName(String* name);
7060
7061   // Returns if this function has been compiled to native code yet.
7062   inline bool is_compiled();
7063
7064   // Returns `false` if formal parameters include rest parameters, optional
7065   // parameters, or destructuring parameters.
7066   // TODO(caitp): make this a flag set during parsing
7067   inline bool has_simple_parameters();
7068
7069   // [next_function_link]: Links functions into various lists, e.g. the list
7070   // of optimized functions hanging off the native_context. The CodeFlusher
7071   // uses this link to chain together flushing candidates. Treated weakly
7072   // by the garbage collector.
7073   DECL_ACCESSORS(next_function_link, Object)
7074
7075   // Prints the name of the function using PrintF.
7076   void PrintName(FILE* out = stdout);
7077
7078   DECLARE_CAST(JSFunction)
7079
7080   // Iterates the objects, including code objects indirectly referenced
7081   // through pointers to the first instruction in the code object.
7082   void JSFunctionIterateBody(int object_size, ObjectVisitor* v);
7083
7084   // Dispatched behavior.
7085   DECLARE_PRINTER(JSFunction)
7086   DECLARE_VERIFIER(JSFunction)
7087
7088   // Returns the number of allocated literals.
7089   inline int NumberOfLiterals();
7090
7091   // Used for flags such as --hydrogen-filter.
7092   bool PassesFilter(const char* raw_filter);
7093
7094   // The function's name if it is configured, otherwise shared function info
7095   // debug name.
7096   static Handle<String> GetDebugName(Handle<JSFunction> function);
7097
7098   // Layout descriptors. The last property (from kNonWeakFieldsEndOffset to
7099   // kSize) is weak and has special handling during garbage collection.
7100   static const int kCodeEntryOffset = JSObject::kHeaderSize;
7101   static const int kPrototypeOrInitialMapOffset =
7102       kCodeEntryOffset + kPointerSize;
7103   static const int kSharedFunctionInfoOffset =
7104       kPrototypeOrInitialMapOffset + kPointerSize;
7105   static const int kContextOffset = kSharedFunctionInfoOffset + kPointerSize;
7106   static const int kLiteralsOffset = kContextOffset + kPointerSize;
7107   static const int kNonWeakFieldsEndOffset = kLiteralsOffset + kPointerSize;
7108   static const int kNextFunctionLinkOffset = kNonWeakFieldsEndOffset;
7109   static const int kSize = kNextFunctionLinkOffset + kPointerSize;
7110
7111   // Layout of the bound-function binding array.
7112   static const int kBoundFunctionIndex = 0;
7113   static const int kBoundThisIndex = 1;
7114   static const int kBoundArgumentsStartIndex = 2;
7115
7116  private:
7117   DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunction);
7118 };
7119
7120
7121 // JSGlobalProxy's prototype must be a JSGlobalObject or null,
7122 // and the prototype is hidden. JSGlobalProxy always delegates
7123 // property accesses to its prototype if the prototype is not null.
7124 //
7125 // A JSGlobalProxy can be reinitialized which will preserve its identity.
7126 //
7127 // Accessing a JSGlobalProxy requires security check.
7128
7129 class JSGlobalProxy : public JSObject {
7130  public:
7131   // [native_context]: the owner native context of this global proxy object.
7132   // It is null value if this object is not used by any context.
7133   DECL_ACCESSORS(native_context, Object)
7134
7135   // [hash]: The hash code property (undefined if not initialized yet).
7136   DECL_ACCESSORS(hash, Object)
7137
7138   DECLARE_CAST(JSGlobalProxy)
7139
7140   inline bool IsDetachedFrom(GlobalObject* global) const;
7141
7142   // Dispatched behavior.
7143   DECLARE_PRINTER(JSGlobalProxy)
7144   DECLARE_VERIFIER(JSGlobalProxy)
7145
7146   // Layout description.
7147   static const int kNativeContextOffset = JSObject::kHeaderSize;
7148   static const int kHashOffset = kNativeContextOffset + kPointerSize;
7149   static const int kSize = kHashOffset + kPointerSize;
7150
7151  private:
7152   DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalProxy);
7153 };
7154
7155
7156 // Common super class for JavaScript global objects and the special
7157 // builtins global objects.
7158 class GlobalObject: public JSObject {
7159  public:
7160   // [builtins]: the object holding the runtime routines written in JS.
7161   DECL_ACCESSORS(builtins, JSBuiltinsObject)
7162
7163   // [native context]: the natives corresponding to this global object.
7164   DECL_ACCESSORS(native_context, Context)
7165
7166   // [global proxy]: the global proxy object of the context
7167   DECL_ACCESSORS(global_proxy, JSObject)
7168
7169   DECLARE_CAST(GlobalObject)
7170
7171   static void InvalidatePropertyCell(Handle<GlobalObject> object,
7172                                      Handle<Name> name);
7173   // Ensure that the global object has a cell for the given property name.
7174   static Handle<PropertyCell> EnsurePropertyCell(Handle<GlobalObject> global,
7175                                                  Handle<Name> name);
7176
7177   // Layout description.
7178   static const int kBuiltinsOffset = JSObject::kHeaderSize;
7179   static const int kNativeContextOffset = kBuiltinsOffset + kPointerSize;
7180   static const int kGlobalProxyOffset = kNativeContextOffset + kPointerSize;
7181   static const int kHeaderSize = kGlobalProxyOffset + kPointerSize;
7182
7183  private:
7184   DISALLOW_IMPLICIT_CONSTRUCTORS(GlobalObject);
7185 };
7186
7187
7188 // JavaScript global object.
7189 class JSGlobalObject: public GlobalObject {
7190  public:
7191   DECLARE_CAST(JSGlobalObject)
7192
7193   inline bool IsDetached();
7194
7195   // Dispatched behavior.
7196   DECLARE_PRINTER(JSGlobalObject)
7197   DECLARE_VERIFIER(JSGlobalObject)
7198
7199   // Layout description.
7200   static const int kSize = GlobalObject::kHeaderSize;
7201
7202  private:
7203   DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalObject);
7204 };
7205
7206
7207 // Builtins global object which holds the runtime routines written in
7208 // JavaScript.
7209 class JSBuiltinsObject: public GlobalObject {
7210  public:
7211   DECLARE_CAST(JSBuiltinsObject)
7212
7213   // Dispatched behavior.
7214   DECLARE_PRINTER(JSBuiltinsObject)
7215   DECLARE_VERIFIER(JSBuiltinsObject)
7216
7217   // Layout description.
7218   static const int kSize = GlobalObject::kHeaderSize;
7219
7220  private:
7221   DISALLOW_IMPLICIT_CONSTRUCTORS(JSBuiltinsObject);
7222 };
7223
7224
7225 // Representation for JS Wrapper objects, String, Number, Boolean, etc.
7226 class JSValue: public JSObject {
7227  public:
7228   // [value]: the object being wrapped.
7229   DECL_ACCESSORS(value, Object)
7230
7231   DECLARE_CAST(JSValue)
7232
7233   // Dispatched behavior.
7234   DECLARE_PRINTER(JSValue)
7235   DECLARE_VERIFIER(JSValue)
7236
7237   // Layout description.
7238   static const int kValueOffset = JSObject::kHeaderSize;
7239   static const int kSize = kValueOffset + kPointerSize;
7240
7241  private:
7242   DISALLOW_IMPLICIT_CONSTRUCTORS(JSValue);
7243 };
7244
7245
7246 class DateCache;
7247
7248 // Representation for JS date objects.
7249 class JSDate: public JSObject {
7250  public:
7251   // If one component is NaN, all of them are, indicating a NaN time value.
7252   // [value]: the time value.
7253   DECL_ACCESSORS(value, Object)
7254   // [year]: caches year. Either undefined, smi, or NaN.
7255   DECL_ACCESSORS(year, Object)
7256   // [month]: caches month. Either undefined, smi, or NaN.
7257   DECL_ACCESSORS(month, Object)
7258   // [day]: caches day. Either undefined, smi, or NaN.
7259   DECL_ACCESSORS(day, Object)
7260   // [weekday]: caches day of week. Either undefined, smi, or NaN.
7261   DECL_ACCESSORS(weekday, Object)
7262   // [hour]: caches hours. Either undefined, smi, or NaN.
7263   DECL_ACCESSORS(hour, Object)
7264   // [min]: caches minutes. Either undefined, smi, or NaN.
7265   DECL_ACCESSORS(min, Object)
7266   // [sec]: caches seconds. Either undefined, smi, or NaN.
7267   DECL_ACCESSORS(sec, Object)
7268   // [cache stamp]: sample of the date cache stamp at the
7269   // moment when chached fields were cached.
7270   DECL_ACCESSORS(cache_stamp, Object)
7271
7272   DECLARE_CAST(JSDate)
7273
7274   // Returns the date field with the specified index.
7275   // See FieldIndex for the list of date fields.
7276   static Object* GetField(Object* date, Smi* index);
7277
7278   void SetValue(Object* value, bool is_value_nan);
7279
7280   // ES6 section 20.3.4.45 Date.prototype [ @@toPrimitive ]
7281   static MUST_USE_RESULT MaybeHandle<Object> ToPrimitive(
7282       Handle<JSReceiver> receiver, Handle<Object> hint);
7283
7284   // Dispatched behavior.
7285   DECLARE_PRINTER(JSDate)
7286   DECLARE_VERIFIER(JSDate)
7287
7288   // The order is important. It must be kept in sync with date macros
7289   // in macros.py.
7290   enum FieldIndex {
7291     kDateValue,
7292     kYear,
7293     kMonth,
7294     kDay,
7295     kWeekday,
7296     kHour,
7297     kMinute,
7298     kSecond,
7299     kFirstUncachedField,
7300     kMillisecond = kFirstUncachedField,
7301     kDays,
7302     kTimeInDay,
7303     kFirstUTCField,
7304     kYearUTC = kFirstUTCField,
7305     kMonthUTC,
7306     kDayUTC,
7307     kWeekdayUTC,
7308     kHourUTC,
7309     kMinuteUTC,
7310     kSecondUTC,
7311     kMillisecondUTC,
7312     kDaysUTC,
7313     kTimeInDayUTC,
7314     kTimezoneOffset
7315   };
7316
7317   // Layout description.
7318   static const int kValueOffset = JSObject::kHeaderSize;
7319   static const int kYearOffset = kValueOffset + kPointerSize;
7320   static const int kMonthOffset = kYearOffset + kPointerSize;
7321   static const int kDayOffset = kMonthOffset + kPointerSize;
7322   static const int kWeekdayOffset = kDayOffset + kPointerSize;
7323   static const int kHourOffset = kWeekdayOffset  + kPointerSize;
7324   static const int kMinOffset = kHourOffset + kPointerSize;
7325   static const int kSecOffset = kMinOffset + kPointerSize;
7326   static const int kCacheStampOffset = kSecOffset + kPointerSize;
7327   static const int kSize = kCacheStampOffset + kPointerSize;
7328
7329  private:
7330   inline Object* DoGetField(FieldIndex index);
7331
7332   Object* GetUTCField(FieldIndex index, double value, DateCache* date_cache);
7333
7334   // Computes and caches the cacheable fields of the date.
7335   inline void SetCachedFields(int64_t local_time_ms, DateCache* date_cache);
7336
7337
7338   DISALLOW_IMPLICIT_CONSTRUCTORS(JSDate);
7339 };
7340
7341
7342 // Representation of message objects used for error reporting through
7343 // the API. The messages are formatted in JavaScript so this object is
7344 // a real JavaScript object. The information used for formatting the
7345 // error messages are not directly accessible from JavaScript to
7346 // prevent leaking information to user code called during error
7347 // formatting.
7348 class JSMessageObject: public JSObject {
7349  public:
7350   // [type]: the type of error message.
7351   inline int type() const;
7352   inline void set_type(int value);
7353
7354   // [arguments]: the arguments for formatting the error message.
7355   DECL_ACCESSORS(argument, Object)
7356
7357   // [script]: the script from which the error message originated.
7358   DECL_ACCESSORS(script, Object)
7359
7360   // [stack_frames]: an array of stack frames for this error object.
7361   DECL_ACCESSORS(stack_frames, Object)
7362
7363   // [start_position]: the start position in the script for the error message.
7364   inline int start_position() const;
7365   inline void set_start_position(int value);
7366
7367   // [end_position]: the end position in the script for the error message.
7368   inline int end_position() const;
7369   inline void set_end_position(int value);
7370
7371   DECLARE_CAST(JSMessageObject)
7372
7373   // Dispatched behavior.
7374   DECLARE_PRINTER(JSMessageObject)
7375   DECLARE_VERIFIER(JSMessageObject)
7376
7377   // Layout description.
7378   static const int kTypeOffset = JSObject::kHeaderSize;
7379   static const int kArgumentsOffset = kTypeOffset + kPointerSize;
7380   static const int kScriptOffset = kArgumentsOffset + kPointerSize;
7381   static const int kStackFramesOffset = kScriptOffset + kPointerSize;
7382   static const int kStartPositionOffset = kStackFramesOffset + kPointerSize;
7383   static const int kEndPositionOffset = kStartPositionOffset + kPointerSize;
7384   static const int kSize = kEndPositionOffset + kPointerSize;
7385
7386   typedef FixedBodyDescriptor<HeapObject::kMapOffset,
7387                               kStackFramesOffset + kPointerSize,
7388                               kSize> BodyDescriptor;
7389 };
7390
7391
7392 // Regular expressions
7393 // The regular expression holds a single reference to a FixedArray in
7394 // the kDataOffset field.
7395 // The FixedArray contains the following data:
7396 // - tag : type of regexp implementation (not compiled yet, atom or irregexp)
7397 // - reference to the original source string
7398 // - reference to the original flag string
7399 // If it is an atom regexp
7400 // - a reference to a literal string to search for
7401 // If it is an irregexp regexp:
7402 // - a reference to code for Latin1 inputs (bytecode or compiled), or a smi
7403 // used for tracking the last usage (used for code flushing).
7404 // - a reference to code for UC16 inputs (bytecode or compiled), or a smi
7405 // used for tracking the last usage (used for code flushing)..
7406 // - max number of registers used by irregexp implementations.
7407 // - number of capture registers (output values) of the regexp.
7408 class JSRegExp: public JSObject {
7409  public:
7410   // Meaning of Type:
7411   // NOT_COMPILED: Initial value. No data has been stored in the JSRegExp yet.
7412   // ATOM: A simple string to match against using an indexOf operation.
7413   // IRREGEXP: Compiled with Irregexp.
7414   // IRREGEXP_NATIVE: Compiled to native code with Irregexp.
7415   enum Type { NOT_COMPILED, ATOM, IRREGEXP };
7416   enum Flag {
7417     NONE = 0,
7418     GLOBAL = 1,
7419     IGNORE_CASE = 2,
7420     MULTILINE = 4,
7421     STICKY = 8,
7422     UNICODE_ESCAPES = 16
7423   };
7424
7425   class Flags {
7426    public:
7427     explicit Flags(uint32_t value) : value_(value) { }
7428     bool is_global() { return (value_ & GLOBAL) != 0; }
7429     bool is_ignore_case() { return (value_ & IGNORE_CASE) != 0; }
7430     bool is_multiline() { return (value_ & MULTILINE) != 0; }
7431     bool is_sticky() { return (value_ & STICKY) != 0; }
7432     bool is_unicode() { return (value_ & UNICODE_ESCAPES) != 0; }
7433     uint32_t value() { return value_; }
7434    private:
7435     uint32_t value_;
7436   };
7437
7438   DECL_ACCESSORS(data, Object)
7439
7440   inline Type TypeTag();
7441   inline int CaptureCount();
7442   inline Flags GetFlags();
7443   inline String* Pattern();
7444   inline Object* DataAt(int index);
7445   // Set implementation data after the object has been prepared.
7446   inline void SetDataAt(int index, Object* value);
7447
7448   static int code_index(bool is_latin1) {
7449     if (is_latin1) {
7450       return kIrregexpLatin1CodeIndex;
7451     } else {
7452       return kIrregexpUC16CodeIndex;
7453     }
7454   }
7455
7456   static int saved_code_index(bool is_latin1) {
7457     if (is_latin1) {
7458       return kIrregexpLatin1CodeSavedIndex;
7459     } else {
7460       return kIrregexpUC16CodeSavedIndex;
7461     }
7462   }
7463
7464   DECLARE_CAST(JSRegExp)
7465
7466   // Dispatched behavior.
7467   DECLARE_VERIFIER(JSRegExp)
7468
7469   static const int kDataOffset = JSObject::kHeaderSize;
7470   static const int kSize = kDataOffset + kPointerSize;
7471
7472   // Indices in the data array.
7473   static const int kTagIndex = 0;
7474   static const int kSourceIndex = kTagIndex + 1;
7475   static const int kFlagsIndex = kSourceIndex + 1;
7476   static const int kDataIndex = kFlagsIndex + 1;
7477   // The data fields are used in different ways depending on the
7478   // value of the tag.
7479   // Atom regexps (literal strings).
7480   static const int kAtomPatternIndex = kDataIndex;
7481
7482   static const int kAtomDataSize = kAtomPatternIndex + 1;
7483
7484   // Irregexp compiled code or bytecode for Latin1. If compilation
7485   // fails, this fields hold an exception object that should be
7486   // thrown if the regexp is used again.
7487   static const int kIrregexpLatin1CodeIndex = kDataIndex;
7488   // Irregexp compiled code or bytecode for UC16.  If compilation
7489   // fails, this fields hold an exception object that should be
7490   // thrown if the regexp is used again.
7491   static const int kIrregexpUC16CodeIndex = kDataIndex + 1;
7492
7493   // Saved instance of Irregexp compiled code or bytecode for Latin1 that
7494   // is a potential candidate for flushing.
7495   static const int kIrregexpLatin1CodeSavedIndex = kDataIndex + 2;
7496   // Saved instance of Irregexp compiled code or bytecode for UC16 that is
7497   // a potential candidate for flushing.
7498   static const int kIrregexpUC16CodeSavedIndex = kDataIndex + 3;
7499
7500   // Maximal number of registers used by either Latin1 or UC16.
7501   // Only used to check that there is enough stack space
7502   static const int kIrregexpMaxRegisterCountIndex = kDataIndex + 4;
7503   // Number of captures in the compiled regexp.
7504   static const int kIrregexpCaptureCountIndex = kDataIndex + 5;
7505
7506   static const int kIrregexpDataSize = kIrregexpCaptureCountIndex + 1;
7507
7508   // Offsets directly into the data fixed array.
7509   static const int kDataTagOffset =
7510       FixedArray::kHeaderSize + kTagIndex * kPointerSize;
7511   static const int kDataOneByteCodeOffset =
7512       FixedArray::kHeaderSize + kIrregexpLatin1CodeIndex * kPointerSize;
7513   static const int kDataUC16CodeOffset =
7514       FixedArray::kHeaderSize + kIrregexpUC16CodeIndex * kPointerSize;
7515   static const int kIrregexpCaptureCountOffset =
7516       FixedArray::kHeaderSize + kIrregexpCaptureCountIndex * kPointerSize;
7517
7518   // In-object fields.
7519   static const int kSourceFieldIndex = 0;
7520   static const int kGlobalFieldIndex = 1;
7521   static const int kIgnoreCaseFieldIndex = 2;
7522   static const int kMultilineFieldIndex = 3;
7523   static const int kLastIndexFieldIndex = 4;
7524   static const int kInObjectFieldCount = 5;
7525
7526   // The uninitialized value for a regexp code object.
7527   static const int kUninitializedValue = -1;
7528
7529   // The compilation error value for the regexp code object. The real error
7530   // object is in the saved code field.
7531   static const int kCompilationErrorValue = -2;
7532
7533   // When we store the sweep generation at which we moved the code from the
7534   // code index to the saved code index we mask it of to be in the [0:255]
7535   // range.
7536   static const int kCodeAgeMask = 0xff;
7537 };
7538
7539
7540 class CompilationCacheShape : public BaseShape<HashTableKey*> {
7541  public:
7542   static inline bool IsMatch(HashTableKey* key, Object* value) {
7543     return key->IsMatch(value);
7544   }
7545
7546   static inline uint32_t Hash(HashTableKey* key) {
7547     return key->Hash();
7548   }
7549
7550   static inline uint32_t HashForObject(HashTableKey* key, Object* object) {
7551     return key->HashForObject(object);
7552   }
7553
7554   static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key);
7555
7556   static const int kPrefixSize = 0;
7557   static const int kEntrySize = 2;
7558 };
7559
7560
7561 // This cache is used in two different variants. For regexp caching, it simply
7562 // maps identifying info of the regexp to the cached regexp object. Scripts and
7563 // eval code only gets cached after a second probe for the code object. To do
7564 // so, on first "put" only a hash identifying the source is entered into the
7565 // cache, mapping it to a lifetime count of the hash. On each call to Age all
7566 // such lifetimes get reduced, and removed once they reach zero. If a second put
7567 // is called while such a hash is live in the cache, the hash gets replaced by
7568 // an actual cache entry. Age also removes stale live entries from the cache.
7569 // Such entries are identified by SharedFunctionInfos pointing to either the
7570 // recompilation stub, or to "old" code. This avoids memory leaks due to
7571 // premature caching of scripts and eval strings that are never needed later.
7572 class CompilationCacheTable: public HashTable<CompilationCacheTable,
7573                                               CompilationCacheShape,
7574                                               HashTableKey*> {
7575  public:
7576   // Find cached value for a string key, otherwise return null.
7577   Handle<Object> Lookup(
7578       Handle<String> src, Handle<Context> context, LanguageMode language_mode);
7579   Handle<Object> LookupEval(
7580       Handle<String> src, Handle<SharedFunctionInfo> shared,
7581       LanguageMode language_mode, int scope_position);
7582   Handle<Object> LookupRegExp(Handle<String> source, JSRegExp::Flags flags);
7583   static Handle<CompilationCacheTable> Put(
7584       Handle<CompilationCacheTable> cache, Handle<String> src,
7585       Handle<Context> context, LanguageMode language_mode,
7586       Handle<Object> value);
7587   static Handle<CompilationCacheTable> PutEval(
7588       Handle<CompilationCacheTable> cache, Handle<String> src,
7589       Handle<SharedFunctionInfo> context, Handle<SharedFunctionInfo> value,
7590       int scope_position);
7591   static Handle<CompilationCacheTable> PutRegExp(
7592       Handle<CompilationCacheTable> cache, Handle<String> src,
7593       JSRegExp::Flags flags, Handle<FixedArray> value);
7594   void Remove(Object* value);
7595   void Age();
7596   static const int kHashGenerations = 10;
7597
7598   DECLARE_CAST(CompilationCacheTable)
7599
7600  private:
7601   DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable);
7602 };
7603
7604
7605 class CodeCache: public Struct {
7606  public:
7607   DECL_ACCESSORS(default_cache, FixedArray)
7608   DECL_ACCESSORS(normal_type_cache, Object)
7609
7610   // Add the code object to the cache.
7611   static void Update(
7612       Handle<CodeCache> cache, Handle<Name> name, Handle<Code> code);
7613
7614   // Lookup code object in the cache. Returns code object if found and undefined
7615   // if not.
7616   Object* Lookup(Name* name, Code::Flags flags);
7617
7618   // Get the internal index of a code object in the cache. Returns -1 if the
7619   // code object is not in that cache. This index can be used to later call
7620   // RemoveByIndex. The cache cannot be modified between a call to GetIndex and
7621   // RemoveByIndex.
7622   int GetIndex(Object* name, Code* code);
7623
7624   // Remove an object from the cache with the provided internal index.
7625   void RemoveByIndex(Object* name, Code* code, int index);
7626
7627   DECLARE_CAST(CodeCache)
7628
7629   // Dispatched behavior.
7630   DECLARE_PRINTER(CodeCache)
7631   DECLARE_VERIFIER(CodeCache)
7632
7633   static const int kDefaultCacheOffset = HeapObject::kHeaderSize;
7634   static const int kNormalTypeCacheOffset =
7635       kDefaultCacheOffset + kPointerSize;
7636   static const int kSize = kNormalTypeCacheOffset + kPointerSize;
7637
7638  private:
7639   static void UpdateDefaultCache(
7640       Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code);
7641   static void UpdateNormalTypeCache(
7642       Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code);
7643   Object* LookupDefaultCache(Name* name, Code::Flags flags);
7644   Object* LookupNormalTypeCache(Name* name, Code::Flags flags);
7645
7646   // Code cache layout of the default cache. Elements are alternating name and
7647   // code objects for non normal load/store/call IC's.
7648   static const int kCodeCacheEntrySize = 2;
7649   static const int kCodeCacheEntryNameOffset = 0;
7650   static const int kCodeCacheEntryCodeOffset = 1;
7651
7652   DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCache);
7653 };
7654
7655
7656 class CodeCacheHashTableShape : public BaseShape<HashTableKey*> {
7657  public:
7658   static inline bool IsMatch(HashTableKey* key, Object* value) {
7659     return key->IsMatch(value);
7660   }
7661
7662   static inline uint32_t Hash(HashTableKey* key) {
7663     return key->Hash();
7664   }
7665
7666   static inline uint32_t HashForObject(HashTableKey* key, Object* object) {
7667     return key->HashForObject(object);
7668   }
7669
7670   static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key);
7671
7672   static const int kPrefixSize = 0;
7673   static const int kEntrySize = 2;
7674 };
7675
7676
7677 class CodeCacheHashTable: public HashTable<CodeCacheHashTable,
7678                                            CodeCacheHashTableShape,
7679                                            HashTableKey*> {
7680  public:
7681   Object* Lookup(Name* name, Code::Flags flags);
7682   static Handle<CodeCacheHashTable> Put(
7683       Handle<CodeCacheHashTable> table,
7684       Handle<Name> name,
7685       Handle<Code> code);
7686
7687   int GetIndex(Name* name, Code::Flags flags);
7688   void RemoveByIndex(int index);
7689
7690   DECLARE_CAST(CodeCacheHashTable)
7691
7692   // Initial size of the fixed array backing the hash table.
7693   static const int kInitialSize = 64;
7694
7695  private:
7696   DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCacheHashTable);
7697 };
7698
7699
7700 class PolymorphicCodeCache: public Struct {
7701  public:
7702   DECL_ACCESSORS(cache, Object)
7703
7704   static void Update(Handle<PolymorphicCodeCache> cache,
7705                      MapHandleList* maps,
7706                      Code::Flags flags,
7707                      Handle<Code> code);
7708
7709
7710   // Returns an undefined value if the entry is not found.
7711   Handle<Object> Lookup(MapHandleList* maps, Code::Flags flags);
7712
7713   DECLARE_CAST(PolymorphicCodeCache)
7714
7715   // Dispatched behavior.
7716   DECLARE_PRINTER(PolymorphicCodeCache)
7717   DECLARE_VERIFIER(PolymorphicCodeCache)
7718
7719   static const int kCacheOffset = HeapObject::kHeaderSize;
7720   static const int kSize = kCacheOffset + kPointerSize;
7721
7722  private:
7723   DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCache);
7724 };
7725
7726
7727 class PolymorphicCodeCacheHashTable
7728     : public HashTable<PolymorphicCodeCacheHashTable,
7729                        CodeCacheHashTableShape,
7730                        HashTableKey*> {
7731  public:
7732   Object* Lookup(MapHandleList* maps, int code_kind);
7733
7734   static Handle<PolymorphicCodeCacheHashTable> Put(
7735       Handle<PolymorphicCodeCacheHashTable> hash_table,
7736       MapHandleList* maps,
7737       int code_kind,
7738       Handle<Code> code);
7739
7740   DECLARE_CAST(PolymorphicCodeCacheHashTable)
7741
7742   static const int kInitialSize = 64;
7743  private:
7744   DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCacheHashTable);
7745 };
7746
7747
7748 class TypeFeedbackInfo: public Struct {
7749  public:
7750   inline int ic_total_count();
7751   inline void set_ic_total_count(int count);
7752
7753   inline int ic_with_type_info_count();
7754   inline void change_ic_with_type_info_count(int delta);
7755
7756   inline int ic_generic_count();
7757   inline void change_ic_generic_count(int delta);
7758
7759   inline void initialize_storage();
7760
7761   inline void change_own_type_change_checksum();
7762   inline int own_type_change_checksum();
7763
7764   inline void set_inlined_type_change_checksum(int checksum);
7765   inline bool matches_inlined_type_change_checksum(int checksum);
7766
7767   DECLARE_CAST(TypeFeedbackInfo)
7768
7769   // Dispatched behavior.
7770   DECLARE_PRINTER(TypeFeedbackInfo)
7771   DECLARE_VERIFIER(TypeFeedbackInfo)
7772
7773   static const int kStorage1Offset = HeapObject::kHeaderSize;
7774   static const int kStorage2Offset = kStorage1Offset + kPointerSize;
7775   static const int kStorage3Offset = kStorage2Offset + kPointerSize;
7776   static const int kSize = kStorage3Offset + kPointerSize;
7777
7778  private:
7779   static const int kTypeChangeChecksumBits = 7;
7780
7781   class ICTotalCountField: public BitField<int, 0,
7782       kSmiValueSize - kTypeChangeChecksumBits> {};  // NOLINT
7783   class OwnTypeChangeChecksum: public BitField<int,
7784       kSmiValueSize - kTypeChangeChecksumBits,
7785       kTypeChangeChecksumBits> {};  // NOLINT
7786   class ICsWithTypeInfoCountField: public BitField<int, 0,
7787       kSmiValueSize - kTypeChangeChecksumBits> {};  // NOLINT
7788   class InlinedTypeChangeChecksum: public BitField<int,
7789       kSmiValueSize - kTypeChangeChecksumBits,
7790       kTypeChangeChecksumBits> {};  // NOLINT
7791
7792   DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackInfo);
7793 };
7794
7795
7796 enum AllocationSiteMode {
7797   DONT_TRACK_ALLOCATION_SITE,
7798   TRACK_ALLOCATION_SITE,
7799   LAST_ALLOCATION_SITE_MODE = TRACK_ALLOCATION_SITE
7800 };
7801
7802
7803 class AllocationSite: public Struct {
7804  public:
7805   static const uint32_t kMaximumArrayBytesToPretransition = 8 * 1024;
7806   static const double kPretenureRatio;
7807   static const int kPretenureMinimumCreated = 100;
7808
7809   // Values for pretenure decision field.
7810   enum PretenureDecision {
7811     kUndecided = 0,
7812     kDontTenure = 1,
7813     kMaybeTenure = 2,
7814     kTenure = 3,
7815     kZombie = 4,
7816     kLastPretenureDecisionValue = kZombie
7817   };
7818
7819   const char* PretenureDecisionName(PretenureDecision decision);
7820
7821   DECL_ACCESSORS(transition_info, Object)
7822   // nested_site threads a list of sites that represent nested literals
7823   // walked in a particular order. So [[1, 2], 1, 2] will have one
7824   // nested_site, but [[1, 2], 3, [4]] will have a list of two.
7825   DECL_ACCESSORS(nested_site, Object)
7826   DECL_ACCESSORS(pretenure_data, Smi)
7827   DECL_ACCESSORS(pretenure_create_count, Smi)
7828   DECL_ACCESSORS(dependent_code, DependentCode)
7829   DECL_ACCESSORS(weak_next, Object)
7830
7831   inline void Initialize();
7832
7833   // This method is expensive, it should only be called for reporting.
7834   bool IsNestedSite();
7835
7836   // transition_info bitfields, for constructed array transition info.
7837   class ElementsKindBits:       public BitField<ElementsKind, 0,  15> {};
7838   class UnusedBits:             public BitField<int,          15, 14> {};
7839   class DoNotInlineBit:         public BitField<bool,         29,  1> {};
7840
7841   // Bitfields for pretenure_data
7842   class MementoFoundCountBits:  public BitField<int,               0, 26> {};
7843   class PretenureDecisionBits:  public BitField<PretenureDecision, 26, 3> {};
7844   class DeoptDependentCodeBit:  public BitField<bool,              29, 1> {};
7845   STATIC_ASSERT(PretenureDecisionBits::kMax >= kLastPretenureDecisionValue);
7846
7847   // Increments the mementos found counter and returns true when the first
7848   // memento was found for a given allocation site.
7849   inline bool IncrementMementoFoundCount();
7850
7851   inline void IncrementMementoCreateCount();
7852
7853   PretenureFlag GetPretenureMode();
7854
7855   void ResetPretenureDecision();
7856
7857   inline PretenureDecision pretenure_decision();
7858   inline void set_pretenure_decision(PretenureDecision decision);
7859
7860   inline bool deopt_dependent_code();
7861   inline void set_deopt_dependent_code(bool deopt);
7862
7863   inline int memento_found_count();
7864   inline void set_memento_found_count(int count);
7865
7866   inline int memento_create_count();
7867   inline void set_memento_create_count(int count);
7868
7869   // The pretenuring decision is made during gc, and the zombie state allows
7870   // us to recognize when an allocation site is just being kept alive because
7871   // a later traversal of new space may discover AllocationMementos that point
7872   // to this AllocationSite.
7873   inline bool IsZombie();
7874
7875   inline bool IsMaybeTenure();
7876
7877   inline void MarkZombie();
7878
7879   inline bool MakePretenureDecision(PretenureDecision current_decision,
7880                                     double ratio,
7881                                     bool maximum_size_scavenge);
7882
7883   inline bool DigestPretenuringFeedback(bool maximum_size_scavenge);
7884
7885   inline ElementsKind GetElementsKind();
7886   inline void SetElementsKind(ElementsKind kind);
7887
7888   inline bool CanInlineCall();
7889   inline void SetDoNotInlineCall();
7890
7891   inline bool SitePointsToLiteral();
7892
7893   static void DigestTransitionFeedback(Handle<AllocationSite> site,
7894                                        ElementsKind to_kind);
7895
7896   DECLARE_PRINTER(AllocationSite)
7897   DECLARE_VERIFIER(AllocationSite)
7898
7899   DECLARE_CAST(AllocationSite)
7900   static inline AllocationSiteMode GetMode(
7901       ElementsKind boilerplate_elements_kind);
7902   static inline AllocationSiteMode GetMode(ElementsKind from, ElementsKind to);
7903   static inline bool CanTrack(InstanceType type);
7904
7905   static const int kTransitionInfoOffset = HeapObject::kHeaderSize;
7906   static const int kNestedSiteOffset = kTransitionInfoOffset + kPointerSize;
7907   static const int kPretenureDataOffset = kNestedSiteOffset + kPointerSize;
7908   static const int kPretenureCreateCountOffset =
7909       kPretenureDataOffset + kPointerSize;
7910   static const int kDependentCodeOffset =
7911       kPretenureCreateCountOffset + kPointerSize;
7912   static const int kWeakNextOffset = kDependentCodeOffset + kPointerSize;
7913   static const int kSize = kWeakNextOffset + kPointerSize;
7914
7915   // During mark compact we need to take special care for the dependent code
7916   // field.
7917   static const int kPointerFieldsBeginOffset = kTransitionInfoOffset;
7918   static const int kPointerFieldsEndOffset = kWeakNextOffset;
7919
7920   // For other visitors, use the fixed body descriptor below.
7921   typedef FixedBodyDescriptor<HeapObject::kHeaderSize,
7922                               kDependentCodeOffset + kPointerSize,
7923                               kSize> BodyDescriptor;
7924
7925  private:
7926   inline bool PretenuringDecisionMade();
7927
7928   DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationSite);
7929 };
7930
7931
7932 class AllocationMemento: public Struct {
7933  public:
7934   static const int kAllocationSiteOffset = HeapObject::kHeaderSize;
7935   static const int kSize = kAllocationSiteOffset + kPointerSize;
7936
7937   DECL_ACCESSORS(allocation_site, Object)
7938
7939   inline bool IsValid();
7940   inline AllocationSite* GetAllocationSite();
7941
7942   DECLARE_PRINTER(AllocationMemento)
7943   DECLARE_VERIFIER(AllocationMemento)
7944
7945   DECLARE_CAST(AllocationMemento)
7946
7947  private:
7948   DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationMemento);
7949 };
7950
7951
7952 // Representation of a slow alias as part of a sloppy arguments objects.
7953 // For fast aliases (if HasSloppyArgumentsElements()):
7954 // - the parameter map contains an index into the context
7955 // - all attributes of the element have default values
7956 // For slow aliases (if HasDictionaryArgumentsElements()):
7957 // - the parameter map contains no fast alias mapping (i.e. the hole)
7958 // - this struct (in the slow backing store) contains an index into the context
7959 // - all attributes are available as part if the property details
7960 class AliasedArgumentsEntry: public Struct {
7961  public:
7962   inline int aliased_context_slot() const;
7963   inline void set_aliased_context_slot(int count);
7964
7965   DECLARE_CAST(AliasedArgumentsEntry)
7966
7967   // Dispatched behavior.
7968   DECLARE_PRINTER(AliasedArgumentsEntry)
7969   DECLARE_VERIFIER(AliasedArgumentsEntry)
7970
7971   static const int kAliasedContextSlot = HeapObject::kHeaderSize;
7972   static const int kSize = kAliasedContextSlot + kPointerSize;
7973
7974  private:
7975   DISALLOW_IMPLICIT_CONSTRUCTORS(AliasedArgumentsEntry);
7976 };
7977
7978
7979 enum AllowNullsFlag {ALLOW_NULLS, DISALLOW_NULLS};
7980 enum RobustnessFlag {ROBUST_STRING_TRAVERSAL, FAST_STRING_TRAVERSAL};
7981
7982
7983 class StringHasher {
7984  public:
7985   explicit inline StringHasher(int length, uint32_t seed);
7986
7987   template <typename schar>
7988   static inline uint32_t HashSequentialString(const schar* chars,
7989                                               int length,
7990                                               uint32_t seed);
7991
7992   // Reads all the data, even for long strings and computes the utf16 length.
7993   static uint32_t ComputeUtf8Hash(Vector<const char> chars,
7994                                   uint32_t seed,
7995                                   int* utf16_length_out);
7996
7997   // Calculated hash value for a string consisting of 1 to
7998   // String::kMaxArrayIndexSize digits with no leading zeros (except "0").
7999   // value is represented decimal value.
8000   static uint32_t MakeArrayIndexHash(uint32_t value, int length);
8001
8002   // No string is allowed to have a hash of zero.  That value is reserved
8003   // for internal properties.  If the hash calculation yields zero then we
8004   // use 27 instead.
8005   static const int kZeroHash = 27;
8006
8007   // Reusable parts of the hashing algorithm.
8008   INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint16_t c));
8009   INLINE(static uint32_t GetHashCore(uint32_t running_hash));
8010   INLINE(static uint32_t ComputeRunningHash(uint32_t running_hash,
8011                                             const uc16* chars, int length));
8012   INLINE(static uint32_t ComputeRunningHashOneByte(uint32_t running_hash,
8013                                                    const char* chars,
8014                                                    int length));
8015
8016  protected:
8017   // Returns the value to store in the hash field of a string with
8018   // the given length and contents.
8019   uint32_t GetHashField();
8020   // Returns true if the hash of this string can be computed without
8021   // looking at the contents.
8022   inline bool has_trivial_hash();
8023   // Adds a block of characters to the hash.
8024   template<typename Char>
8025   inline void AddCharacters(const Char* chars, int len);
8026
8027  private:
8028   // Add a character to the hash.
8029   inline void AddCharacter(uint16_t c);
8030   // Update index. Returns true if string is still an index.
8031   inline bool UpdateIndex(uint16_t c);
8032
8033   int length_;
8034   uint32_t raw_running_hash_;
8035   uint32_t array_index_;
8036   bool is_array_index_;
8037   bool is_first_char_;
8038   DISALLOW_COPY_AND_ASSIGN(StringHasher);
8039 };
8040
8041
8042 class IteratingStringHasher : public StringHasher {
8043  public:
8044   static inline uint32_t Hash(String* string, uint32_t seed);
8045   inline void VisitOneByteString(const uint8_t* chars, int length);
8046   inline void VisitTwoByteString(const uint16_t* chars, int length);
8047
8048  private:
8049   inline IteratingStringHasher(int len, uint32_t seed);
8050   void VisitConsString(ConsString* cons_string);
8051   DISALLOW_COPY_AND_ASSIGN(IteratingStringHasher);
8052 };
8053
8054
8055 // The characteristics of a string are stored in its map.  Retrieving these
8056 // few bits of information is moderately expensive, involving two memory
8057 // loads where the second is dependent on the first.  To improve efficiency
8058 // the shape of the string is given its own class so that it can be retrieved
8059 // once and used for several string operations.  A StringShape is small enough
8060 // to be passed by value and is immutable, but be aware that flattening a
8061 // string can potentially alter its shape.  Also be aware that a GC caused by
8062 // something else can alter the shape of a string due to ConsString
8063 // shortcutting.  Keeping these restrictions in mind has proven to be error-
8064 // prone and so we no longer put StringShapes in variables unless there is a
8065 // concrete performance benefit at that particular point in the code.
8066 class StringShape BASE_EMBEDDED {
8067  public:
8068   inline explicit StringShape(const String* s);
8069   inline explicit StringShape(Map* s);
8070   inline explicit StringShape(InstanceType t);
8071   inline bool IsSequential();
8072   inline bool IsExternal();
8073   inline bool IsCons();
8074   inline bool IsSliced();
8075   inline bool IsIndirect();
8076   inline bool IsExternalOneByte();
8077   inline bool IsExternalTwoByte();
8078   inline bool IsSequentialOneByte();
8079   inline bool IsSequentialTwoByte();
8080   inline bool IsInternalized();
8081   inline StringRepresentationTag representation_tag();
8082   inline uint32_t encoding_tag();
8083   inline uint32_t full_representation_tag();
8084   inline uint32_t size_tag();
8085 #ifdef DEBUG
8086   inline uint32_t type() { return type_; }
8087   inline void invalidate() { valid_ = false; }
8088   inline bool valid() { return valid_; }
8089 #else
8090   inline void invalidate() { }
8091 #endif
8092
8093  private:
8094   uint32_t type_;
8095 #ifdef DEBUG
8096   inline void set_valid() { valid_ = true; }
8097   bool valid_;
8098 #else
8099   inline void set_valid() { }
8100 #endif
8101 };
8102
8103
8104 // The Name abstract class captures anything that can be used as a property
8105 // name, i.e., strings and symbols.  All names store a hash value.
8106 class Name: public HeapObject {
8107  public:
8108   // Get and set the hash field of the name.
8109   inline uint32_t hash_field();
8110   inline void set_hash_field(uint32_t value);
8111
8112   // Tells whether the hash code has been computed.
8113   inline bool HasHashCode();
8114
8115   // Returns a hash value used for the property table
8116   inline uint32_t Hash();
8117
8118   // Equality operations.
8119   inline bool Equals(Name* other);
8120   inline static bool Equals(Handle<Name> one, Handle<Name> two);
8121
8122   // Conversion.
8123   inline bool AsArrayIndex(uint32_t* index);
8124
8125   // If the name is private, it can only name own properties.
8126   inline bool IsPrivate();
8127
8128   // If the name is a non-flat string, this method returns a flat version of the
8129   // string. Otherwise it'll just return the input.
8130   static inline Handle<Name> Flatten(Handle<Name> name,
8131                                      PretenureFlag pretenure = NOT_TENURED);
8132
8133   // Return a string version of this name that is converted according to the
8134   // rules described in ES6 section 9.2.11.
8135   MUST_USE_RESULT static MaybeHandle<String> ToFunctionName(Handle<Name> name);
8136
8137   DECLARE_CAST(Name)
8138
8139   DECLARE_PRINTER(Name)
8140 #if TRACE_MAPS
8141   void NameShortPrint();
8142   int NameShortPrint(Vector<char> str);
8143 #endif
8144
8145   // Layout description.
8146   static const int kHashFieldSlot = HeapObject::kHeaderSize;
8147 #if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT
8148   static const int kHashFieldOffset = kHashFieldSlot;
8149 #else
8150   static const int kHashFieldOffset = kHashFieldSlot + kIntSize;
8151 #endif
8152   static const int kSize = kHashFieldSlot + kPointerSize;
8153
8154   // Mask constant for checking if a name has a computed hash code
8155   // and if it is a string that is an array index.  The least significant bit
8156   // indicates whether a hash code has been computed.  If the hash code has
8157   // been computed the 2nd bit tells whether the string can be used as an
8158   // array index.
8159   static const int kHashNotComputedMask = 1;
8160   static const int kIsNotArrayIndexMask = 1 << 1;
8161   static const int kNofHashBitFields = 2;
8162
8163   // Shift constant retrieving hash code from hash field.
8164   static const int kHashShift = kNofHashBitFields;
8165
8166   // Only these bits are relevant in the hash, since the top two are shifted
8167   // out.
8168   static const uint32_t kHashBitMask = 0xffffffffu >> kHashShift;
8169
8170   // Array index strings this short can keep their index in the hash field.
8171   static const int kMaxCachedArrayIndexLength = 7;
8172
8173   // For strings which are array indexes the hash value has the string length
8174   // mixed into the hash, mainly to avoid a hash value of zero which would be
8175   // the case for the string '0'. 24 bits are used for the array index value.
8176   static const int kArrayIndexValueBits = 24;
8177   static const int kArrayIndexLengthBits =
8178       kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields;
8179
8180   STATIC_ASSERT((kArrayIndexLengthBits > 0));
8181
8182   class ArrayIndexValueBits : public BitField<unsigned int, kNofHashBitFields,
8183       kArrayIndexValueBits> {};  // NOLINT
8184   class ArrayIndexLengthBits : public BitField<unsigned int,
8185       kNofHashBitFields + kArrayIndexValueBits,
8186       kArrayIndexLengthBits> {};  // NOLINT
8187
8188   // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we
8189   // could use a mask to test if the length of string is less than or equal to
8190   // kMaxCachedArrayIndexLength.
8191   STATIC_ASSERT(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1));
8192
8193   static const unsigned int kContainsCachedArrayIndexMask =
8194       (~static_cast<unsigned>(kMaxCachedArrayIndexLength)
8195        << ArrayIndexLengthBits::kShift) |
8196       kIsNotArrayIndexMask;
8197
8198   // Value of empty hash field indicating that the hash is not computed.
8199   static const int kEmptyHashField =
8200       kIsNotArrayIndexMask | kHashNotComputedMask;
8201
8202  protected:
8203   static inline bool IsHashFieldComputed(uint32_t field);
8204
8205  private:
8206   DISALLOW_IMPLICIT_CONSTRUCTORS(Name);
8207 };
8208
8209
8210 // ES6 symbols.
8211 class Symbol: public Name {
8212  public:
8213   // [name]: The print name of a symbol, or undefined if none.
8214   DECL_ACCESSORS(name, Object)
8215
8216   DECL_ACCESSORS(flags, Smi)
8217
8218   // [is_private]: Whether this is a private symbol.  Private symbols can only
8219   // be used to designate own properties of objects.
8220   DECL_BOOLEAN_ACCESSORS(is_private)
8221
8222   DECLARE_CAST(Symbol)
8223
8224   // Dispatched behavior.
8225   DECLARE_PRINTER(Symbol)
8226   DECLARE_VERIFIER(Symbol)
8227
8228   // Layout description.
8229   static const int kNameOffset = Name::kSize;
8230   static const int kFlagsOffset = kNameOffset + kPointerSize;
8231   static const int kSize = kFlagsOffset + kPointerSize;
8232
8233   typedef FixedBodyDescriptor<kNameOffset, kFlagsOffset, kSize> BodyDescriptor;
8234
8235   void SymbolShortPrint(std::ostream& os);
8236
8237  private:
8238   static const int kPrivateBit = 0;
8239
8240   const char* PrivateSymbolToName() const;
8241
8242 #if TRACE_MAPS
8243   friend class Name;  // For PrivateSymbolToName.
8244 #endif
8245
8246   DISALLOW_IMPLICIT_CONSTRUCTORS(Symbol);
8247 };
8248
8249
8250 class ConsString;
8251
8252 // The String abstract class captures JavaScript string values:
8253 //
8254 // Ecma-262:
8255 //  4.3.16 String Value
8256 //    A string value is a member of the type String and is a finite
8257 //    ordered sequence of zero or more 16-bit unsigned integer values.
8258 //
8259 // All string values have a length field.
8260 class String: public Name {
8261  public:
8262   enum Encoding { ONE_BYTE_ENCODING, TWO_BYTE_ENCODING };
8263
8264   // Array index strings this short can keep their index in the hash field.
8265   static const int kMaxCachedArrayIndexLength = 7;
8266
8267   // For strings which are array indexes the hash value has the string length
8268   // mixed into the hash, mainly to avoid a hash value of zero which would be
8269   // the case for the string '0'. 24 bits are used for the array index value.
8270   static const int kArrayIndexValueBits = 24;
8271   static const int kArrayIndexLengthBits =
8272       kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields;
8273
8274   STATIC_ASSERT((kArrayIndexLengthBits > 0));
8275
8276   class ArrayIndexValueBits : public BitField<unsigned int, kNofHashBitFields,
8277       kArrayIndexValueBits> {};  // NOLINT
8278   class ArrayIndexLengthBits : public BitField<unsigned int,
8279       kNofHashBitFields + kArrayIndexValueBits,
8280       kArrayIndexLengthBits> {};  // NOLINT
8281
8282   // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we
8283   // could use a mask to test if the length of string is less than or equal to
8284   // kMaxCachedArrayIndexLength.
8285   STATIC_ASSERT(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1));
8286
8287   static const unsigned int kContainsCachedArrayIndexMask =
8288       (~static_cast<unsigned>(kMaxCachedArrayIndexLength)
8289        << ArrayIndexLengthBits::kShift) |
8290       kIsNotArrayIndexMask;
8291
8292   class SubStringRange {
8293    public:
8294     explicit inline SubStringRange(String* string, int first = 0,
8295                                    int length = -1);
8296     class iterator;
8297     inline iterator begin();
8298     inline iterator end();
8299
8300    private:
8301     String* string_;
8302     int first_;
8303     int length_;
8304   };
8305
8306   // Representation of the flat content of a String.
8307   // A non-flat string doesn't have flat content.
8308   // A flat string has content that's encoded as a sequence of either
8309   // one-byte chars or two-byte UC16.
8310   // Returned by String::GetFlatContent().
8311   class FlatContent {
8312    public:
8313     // Returns true if the string is flat and this structure contains content.
8314     bool IsFlat() { return state_ != NON_FLAT; }
8315     // Returns true if the structure contains one-byte content.
8316     bool IsOneByte() { return state_ == ONE_BYTE; }
8317     // Returns true if the structure contains two-byte content.
8318     bool IsTwoByte() { return state_ == TWO_BYTE; }
8319
8320     // Return the one byte content of the string. Only use if IsOneByte()
8321     // returns true.
8322     Vector<const uint8_t> ToOneByteVector() {
8323       DCHECK_EQ(ONE_BYTE, state_);
8324       return Vector<const uint8_t>(onebyte_start, length_);
8325     }
8326     // Return the two-byte content of the string. Only use if IsTwoByte()
8327     // returns true.
8328     Vector<const uc16> ToUC16Vector() {
8329       DCHECK_EQ(TWO_BYTE, state_);
8330       return Vector<const uc16>(twobyte_start, length_);
8331     }
8332
8333     uc16 Get(int i) {
8334       DCHECK(i < length_);
8335       DCHECK(state_ != NON_FLAT);
8336       if (state_ == ONE_BYTE) return onebyte_start[i];
8337       return twobyte_start[i];
8338     }
8339
8340     bool UsesSameString(const FlatContent& other) const {
8341       return onebyte_start == other.onebyte_start;
8342     }
8343
8344    private:
8345     enum State { NON_FLAT, ONE_BYTE, TWO_BYTE };
8346
8347     // Constructors only used by String::GetFlatContent().
8348     explicit FlatContent(const uint8_t* start, int length)
8349         : onebyte_start(start), length_(length), state_(ONE_BYTE) {}
8350     explicit FlatContent(const uc16* start, int length)
8351         : twobyte_start(start), length_(length), state_(TWO_BYTE) { }
8352     FlatContent() : onebyte_start(NULL), length_(0), state_(NON_FLAT) { }
8353
8354     union {
8355       const uint8_t* onebyte_start;
8356       const uc16* twobyte_start;
8357     };
8358     int length_;
8359     State state_;
8360
8361     friend class String;
8362     friend class IterableSubString;
8363   };
8364
8365   template <typename Char>
8366   INLINE(Vector<const Char> GetCharVector());
8367
8368   // Get and set the length of the string.
8369   inline int length() const;
8370   inline void set_length(int value);
8371
8372   // Get and set the length of the string using acquire loads and release
8373   // stores.
8374   inline int synchronized_length() const;
8375   inline void synchronized_set_length(int value);
8376
8377   // Returns whether this string has only one-byte chars, i.e. all of them can
8378   // be one-byte encoded.  This might be the case even if the string is
8379   // two-byte.  Such strings may appear when the embedder prefers
8380   // two-byte external representations even for one-byte data.
8381   inline bool IsOneByteRepresentation() const;
8382   inline bool IsTwoByteRepresentation() const;
8383
8384   // Cons and slices have an encoding flag that may not represent the actual
8385   // encoding of the underlying string.  This is taken into account here.
8386   // Requires: this->IsFlat()
8387   inline bool IsOneByteRepresentationUnderneath();
8388   inline bool IsTwoByteRepresentationUnderneath();
8389
8390   // NOTE: this should be considered only a hint.  False negatives are
8391   // possible.
8392   inline bool HasOnlyOneByteChars();
8393
8394   // Get and set individual two byte chars in the string.
8395   inline void Set(int index, uint16_t value);
8396   // Get individual two byte char in the string.  Repeated calls
8397   // to this method are not efficient unless the string is flat.
8398   INLINE(uint16_t Get(int index));
8399
8400   // ES6 section 7.1.3.1 ToNumber Applied to the String Type
8401   static Handle<Object> ToNumber(Handle<String> subject);
8402
8403   // Flattens the string.  Checks first inline to see if it is
8404   // necessary.  Does nothing if the string is not a cons string.
8405   // Flattening allocates a sequential string with the same data as
8406   // the given string and mutates the cons string to a degenerate
8407   // form, where the first component is the new sequential string and
8408   // the second component is the empty string.  If allocation fails,
8409   // this function returns a failure.  If flattening succeeds, this
8410   // function returns the sequential string that is now the first
8411   // component of the cons string.
8412   //
8413   // Degenerate cons strings are handled specially by the garbage
8414   // collector (see IsShortcutCandidate).
8415
8416   static inline Handle<String> Flatten(Handle<String> string,
8417                                        PretenureFlag pretenure = NOT_TENURED);
8418
8419   // Tries to return the content of a flat string as a structure holding either
8420   // a flat vector of char or of uc16.
8421   // If the string isn't flat, and therefore doesn't have flat content, the
8422   // returned structure will report so, and can't provide a vector of either
8423   // kind.
8424   FlatContent GetFlatContent();
8425
8426   // Returns the parent of a sliced string or first part of a flat cons string.
8427   // Requires: StringShape(this).IsIndirect() && this->IsFlat()
8428   inline String* GetUnderlying();
8429
8430   // String equality operations.
8431   inline bool Equals(String* other);
8432   inline static bool Equals(Handle<String> one, Handle<String> two);
8433   bool IsUtf8EqualTo(Vector<const char> str, bool allow_prefix_match = false);
8434   bool IsOneByteEqualTo(Vector<const uint8_t> str);
8435   bool IsTwoByteEqualTo(Vector<const uc16> str);
8436
8437   // Return a UTF8 representation of the string.  The string is null
8438   // terminated but may optionally contain nulls.  Length is returned
8439   // in length_output if length_output is not a null pointer  The string
8440   // should be nearly flat, otherwise the performance of this method may
8441   // be very slow (quadratic in the length).  Setting robustness_flag to
8442   // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust  This means it
8443   // handles unexpected data without causing assert failures and it does not
8444   // do any heap allocations.  This is useful when printing stack traces.
8445   base::SmartArrayPointer<char> ToCString(AllowNullsFlag allow_nulls,
8446                                           RobustnessFlag robustness_flag,
8447                                           int offset, int length,
8448                                           int* length_output = 0);
8449   base::SmartArrayPointer<char> ToCString(
8450       AllowNullsFlag allow_nulls = DISALLOW_NULLS,
8451       RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL,
8452       int* length_output = 0);
8453
8454   // Return a 16 bit Unicode representation of the string.
8455   // The string should be nearly flat, otherwise the performance of
8456   // of this method may be very bad.  Setting robustness_flag to
8457   // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust  This means it
8458   // handles unexpected data without causing assert failures and it does not
8459   // do any heap allocations.  This is useful when printing stack traces.
8460   base::SmartArrayPointer<uc16> ToWideCString(
8461       RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL);
8462
8463   bool ComputeArrayIndex(uint32_t* index);
8464
8465   // Externalization.
8466   bool MakeExternal(v8::String::ExternalStringResource* resource);
8467   bool MakeExternal(v8::String::ExternalOneByteStringResource* resource);
8468
8469   // Conversion.
8470   inline bool AsArrayIndex(uint32_t* index);
8471
8472   DECLARE_CAST(String)
8473
8474   void PrintOn(FILE* out);
8475
8476   // For use during stack traces.  Performs rudimentary sanity check.
8477   bool LooksValid();
8478
8479   // Dispatched behavior.
8480   void StringShortPrint(StringStream* accumulator);
8481   void PrintUC16(std::ostream& os, int start = 0, int end = -1);  // NOLINT
8482 #if defined(DEBUG) || defined(OBJECT_PRINT)
8483   char* ToAsciiArray();
8484 #endif
8485   DECLARE_PRINTER(String)
8486   DECLARE_VERIFIER(String)
8487
8488   inline bool IsFlat();
8489
8490   // Layout description.
8491   static const int kLengthOffset = Name::kSize;
8492   static const int kSize = kLengthOffset + kPointerSize;
8493
8494   // Maximum number of characters to consider when trying to convert a string
8495   // value into an array index.
8496   static const int kMaxArrayIndexSize = 10;
8497   STATIC_ASSERT(kMaxArrayIndexSize < (1 << kArrayIndexLengthBits));
8498
8499   // Max char codes.
8500   static const int32_t kMaxOneByteCharCode = unibrow::Latin1::kMaxChar;
8501   static const uint32_t kMaxOneByteCharCodeU = unibrow::Latin1::kMaxChar;
8502   static const int kMaxUtf16CodeUnit = 0xffff;
8503   static const uint32_t kMaxUtf16CodeUnitU = kMaxUtf16CodeUnit;
8504
8505   // Value of hash field containing computed hash equal to zero.
8506   static const int kEmptyStringHash = kIsNotArrayIndexMask;
8507
8508   // Maximal string length.
8509   static const int kMaxLength = (1 << 28) - 16;
8510
8511   // Max length for computing hash. For strings longer than this limit the
8512   // string length is used as the hash value.
8513   static const int kMaxHashCalcLength = 16383;
8514
8515   // Limit for truncation in short printing.
8516   static const int kMaxShortPrintLength = 1024;
8517
8518   // Support for regular expressions.
8519   const uc16* GetTwoByteData(unsigned start);
8520
8521   // Helper function for flattening strings.
8522   template <typename sinkchar>
8523   static void WriteToFlat(String* source,
8524                           sinkchar* sink,
8525                           int from,
8526                           int to);
8527
8528   // The return value may point to the first aligned word containing the first
8529   // non-one-byte character, rather than directly to the non-one-byte character.
8530   // If the return value is >= the passed length, the entire string was
8531   // one-byte.
8532   static inline int NonAsciiStart(const char* chars, int length) {
8533     const char* start = chars;
8534     const char* limit = chars + length;
8535
8536     if (length >= kIntptrSize) {
8537       // Check unaligned bytes.
8538       while (!IsAligned(reinterpret_cast<intptr_t>(chars), sizeof(uintptr_t))) {
8539         if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) {
8540           return static_cast<int>(chars - start);
8541         }
8542         ++chars;
8543       }
8544       // Check aligned words.
8545       DCHECK(unibrow::Utf8::kMaxOneByteChar == 0x7F);
8546       const uintptr_t non_one_byte_mask = kUintptrAllBitsSet / 0xFF * 0x80;
8547       while (chars + sizeof(uintptr_t) <= limit) {
8548         if (*reinterpret_cast<const uintptr_t*>(chars) & non_one_byte_mask) {
8549           return static_cast<int>(chars - start);
8550         }
8551         chars += sizeof(uintptr_t);
8552       }
8553     }
8554     // Check remaining unaligned bytes.
8555     while (chars < limit) {
8556       if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) {
8557         return static_cast<int>(chars - start);
8558       }
8559       ++chars;
8560     }
8561
8562     return static_cast<int>(chars - start);
8563   }
8564
8565   static inline bool IsAscii(const char* chars, int length) {
8566     return NonAsciiStart(chars, length) >= length;
8567   }
8568
8569   static inline bool IsAscii(const uint8_t* chars, int length) {
8570     return
8571         NonAsciiStart(reinterpret_cast<const char*>(chars), length) >= length;
8572   }
8573
8574   static inline int NonOneByteStart(const uc16* chars, int length) {
8575     const uc16* limit = chars + length;
8576     const uc16* start = chars;
8577     while (chars < limit) {
8578       if (*chars > kMaxOneByteCharCodeU) return static_cast<int>(chars - start);
8579       ++chars;
8580     }
8581     return static_cast<int>(chars - start);
8582   }
8583
8584   static inline bool IsOneByte(const uc16* chars, int length) {
8585     return NonOneByteStart(chars, length) >= length;
8586   }
8587
8588   template<class Visitor>
8589   static inline ConsString* VisitFlat(Visitor* visitor,
8590                                       String* string,
8591                                       int offset = 0);
8592
8593   static Handle<FixedArray> CalculateLineEnds(Handle<String> string,
8594                                               bool include_ending_line);
8595
8596   // Use the hash field to forward to the canonical internalized string
8597   // when deserializing an internalized string.
8598   inline void SetForwardedInternalizedString(String* string);
8599   inline String* GetForwardedInternalizedString();
8600
8601  private:
8602   friend class Name;
8603   friend class StringTableInsertionKey;
8604
8605   static Handle<String> SlowFlatten(Handle<ConsString> cons,
8606                                     PretenureFlag tenure);
8607
8608   // Slow case of String::Equals.  This implementation works on any strings
8609   // but it is most efficient on strings that are almost flat.
8610   bool SlowEquals(String* other);
8611
8612   static bool SlowEquals(Handle<String> one, Handle<String> two);
8613
8614   // Slow case of AsArrayIndex.
8615   bool SlowAsArrayIndex(uint32_t* index);
8616
8617   // Compute and set the hash code.
8618   uint32_t ComputeAndSetHash();
8619
8620   DISALLOW_IMPLICIT_CONSTRUCTORS(String);
8621 };
8622
8623
8624 // The SeqString abstract class captures sequential string values.
8625 class SeqString: public String {
8626  public:
8627   DECLARE_CAST(SeqString)
8628
8629   // Layout description.
8630   static const int kHeaderSize = String::kSize;
8631
8632   // Truncate the string in-place if possible and return the result.
8633   // In case of new_length == 0, the empty string is returned without
8634   // truncating the original string.
8635   MUST_USE_RESULT static Handle<String> Truncate(Handle<SeqString> string,
8636                                                  int new_length);
8637  private:
8638   DISALLOW_IMPLICIT_CONSTRUCTORS(SeqString);
8639 };
8640
8641
8642 // The OneByteString class captures sequential one-byte string objects.
8643 // Each character in the OneByteString is an one-byte character.
8644 class SeqOneByteString: public SeqString {
8645  public:
8646   static const bool kHasOneByteEncoding = true;
8647
8648   // Dispatched behavior.
8649   inline uint16_t SeqOneByteStringGet(int index);
8650   inline void SeqOneByteStringSet(int index, uint16_t value);
8651
8652   // Get the address of the characters in this string.
8653   inline Address GetCharsAddress();
8654
8655   inline uint8_t* GetChars();
8656
8657   DECLARE_CAST(SeqOneByteString)
8658
8659   // Garbage collection support.  This method is called by the
8660   // garbage collector to compute the actual size of an OneByteString
8661   // instance.
8662   inline int SeqOneByteStringSize(InstanceType instance_type);
8663
8664   // Computes the size for an OneByteString instance of a given length.
8665   static int SizeFor(int length) {
8666     return OBJECT_POINTER_ALIGN(kHeaderSize + length * kCharSize);
8667   }
8668
8669   // Maximal memory usage for a single sequential one-byte string.
8670   static const int kMaxSize = 512 * MB - 1;
8671   STATIC_ASSERT((kMaxSize - kHeaderSize) >= String::kMaxLength);
8672
8673  private:
8674   DISALLOW_IMPLICIT_CONSTRUCTORS(SeqOneByteString);
8675 };
8676
8677
8678 // The TwoByteString class captures sequential unicode string objects.
8679 // Each character in the TwoByteString is a two-byte uint16_t.
8680 class SeqTwoByteString: public SeqString {
8681  public:
8682   static const bool kHasOneByteEncoding = false;
8683
8684   // Dispatched behavior.
8685   inline uint16_t SeqTwoByteStringGet(int index);
8686   inline void SeqTwoByteStringSet(int index, uint16_t value);
8687
8688   // Get the address of the characters in this string.
8689   inline Address GetCharsAddress();
8690
8691   inline uc16* GetChars();
8692
8693   // For regexp code.
8694   const uint16_t* SeqTwoByteStringGetData(unsigned start);
8695
8696   DECLARE_CAST(SeqTwoByteString)
8697
8698   // Garbage collection support.  This method is called by the
8699   // garbage collector to compute the actual size of a TwoByteString
8700   // instance.
8701   inline int SeqTwoByteStringSize(InstanceType instance_type);
8702
8703   // Computes the size for a TwoByteString instance of a given length.
8704   static int SizeFor(int length) {
8705     return OBJECT_POINTER_ALIGN(kHeaderSize + length * kShortSize);
8706   }
8707
8708   // Maximal memory usage for a single sequential two-byte string.
8709   static const int kMaxSize = 512 * MB - 1;
8710   STATIC_ASSERT(static_cast<int>((kMaxSize - kHeaderSize)/sizeof(uint16_t)) >=
8711                String::kMaxLength);
8712
8713  private:
8714   DISALLOW_IMPLICIT_CONSTRUCTORS(SeqTwoByteString);
8715 };
8716
8717
8718 // The ConsString class describes string values built by using the
8719 // addition operator on strings.  A ConsString is a pair where the
8720 // first and second components are pointers to other string values.
8721 // One or both components of a ConsString can be pointers to other
8722 // ConsStrings, creating a binary tree of ConsStrings where the leaves
8723 // are non-ConsString string values.  The string value represented by
8724 // a ConsString can be obtained by concatenating the leaf string
8725 // values in a left-to-right depth-first traversal of the tree.
8726 class ConsString: public String {
8727  public:
8728   // First string of the cons cell.
8729   inline String* first();
8730   // Doesn't check that the result is a string, even in debug mode.  This is
8731   // useful during GC where the mark bits confuse the checks.
8732   inline Object* unchecked_first();
8733   inline void set_first(String* first,
8734                         WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
8735
8736   // Second string of the cons cell.
8737   inline String* second();
8738   // Doesn't check that the result is a string, even in debug mode.  This is
8739   // useful during GC where the mark bits confuse the checks.
8740   inline Object* unchecked_second();
8741   inline void set_second(String* second,
8742                          WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
8743
8744   // Dispatched behavior.
8745   uint16_t ConsStringGet(int index);
8746
8747   DECLARE_CAST(ConsString)
8748
8749   // Layout description.
8750   static const int kFirstOffset = POINTER_SIZE_ALIGN(String::kSize);
8751   static const int kSecondOffset = kFirstOffset + kPointerSize;
8752   static const int kSize = kSecondOffset + kPointerSize;
8753
8754   // Minimum length for a cons string.
8755   static const int kMinLength = 13;
8756
8757   typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize>
8758           BodyDescriptor;
8759
8760   DECLARE_VERIFIER(ConsString)
8761
8762  private:
8763   DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString);
8764 };
8765
8766
8767 // The Sliced String class describes strings that are substrings of another
8768 // sequential string.  The motivation is to save time and memory when creating
8769 // a substring.  A Sliced String is described as a pointer to the parent,
8770 // the offset from the start of the parent string and the length.  Using
8771 // a Sliced String therefore requires unpacking of the parent string and
8772 // adding the offset to the start address.  A substring of a Sliced String
8773 // are not nested since the double indirection is simplified when creating
8774 // such a substring.
8775 // Currently missing features are:
8776 //  - handling externalized parent strings
8777 //  - external strings as parent
8778 //  - truncating sliced string to enable otherwise unneeded parent to be GC'ed.
8779 class SlicedString: public String {
8780  public:
8781   inline String* parent();
8782   inline void set_parent(String* parent,
8783                          WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
8784   inline int offset() const;
8785   inline void set_offset(int offset);
8786
8787   // Dispatched behavior.
8788   uint16_t SlicedStringGet(int index);
8789
8790   DECLARE_CAST(SlicedString)
8791
8792   // Layout description.
8793   static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize);
8794   static const int kOffsetOffset = kParentOffset + kPointerSize;
8795   static const int kSize = kOffsetOffset + kPointerSize;
8796
8797   // Minimum length for a sliced string.
8798   static const int kMinLength = 13;
8799
8800   typedef FixedBodyDescriptor<kParentOffset,
8801                               kOffsetOffset + kPointerSize, kSize>
8802           BodyDescriptor;
8803
8804   DECLARE_VERIFIER(SlicedString)
8805
8806  private:
8807   DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString);
8808 };
8809
8810
8811 // The ExternalString class describes string values that are backed by
8812 // a string resource that lies outside the V8 heap.  ExternalStrings
8813 // consist of the length field common to all strings, a pointer to the
8814 // external resource.  It is important to ensure (externally) that the
8815 // resource is not deallocated while the ExternalString is live in the
8816 // V8 heap.
8817 //
8818 // The API expects that all ExternalStrings are created through the
8819 // API.  Therefore, ExternalStrings should not be used internally.
8820 class ExternalString: public String {
8821  public:
8822   DECLARE_CAST(ExternalString)
8823
8824   // Layout description.
8825   static const int kResourceOffset = POINTER_SIZE_ALIGN(String::kSize);
8826   static const int kShortSize = kResourceOffset + kPointerSize;
8827   static const int kResourceDataOffset = kResourceOffset + kPointerSize;
8828   static const int kSize = kResourceDataOffset + kPointerSize;
8829
8830   static const int kMaxShortLength =
8831       (kShortSize - SeqString::kHeaderSize) / kCharSize;
8832
8833   // Return whether external string is short (data pointer is not cached).
8834   inline bool is_short();
8835
8836   STATIC_ASSERT(kResourceOffset == Internals::kStringResourceOffset);
8837
8838  private:
8839   DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalString);
8840 };
8841
8842
8843 // The ExternalOneByteString class is an external string backed by an
8844 // one-byte string.
8845 class ExternalOneByteString : public ExternalString {
8846  public:
8847   static const bool kHasOneByteEncoding = true;
8848
8849   typedef v8::String::ExternalOneByteStringResource Resource;
8850
8851   // The underlying resource.
8852   inline const Resource* resource();
8853   inline void set_resource(const Resource* buffer);
8854
8855   // Update the pointer cache to the external character array.
8856   // The cached pointer is always valid, as the external character array does =
8857   // not move during lifetime.  Deserialization is the only exception, after
8858   // which the pointer cache has to be refreshed.
8859   inline void update_data_cache();
8860
8861   inline const uint8_t* GetChars();
8862
8863   // Dispatched behavior.
8864   inline uint16_t ExternalOneByteStringGet(int index);
8865
8866   DECLARE_CAST(ExternalOneByteString)
8867
8868   // Garbage collection support.
8869   inline void ExternalOneByteStringIterateBody(ObjectVisitor* v);
8870
8871   template <typename StaticVisitor>
8872   inline void ExternalOneByteStringIterateBody();
8873
8874  private:
8875   DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString);
8876 };
8877
8878
8879 // The ExternalTwoByteString class is an external string backed by a UTF-16
8880 // encoded string.
8881 class ExternalTwoByteString: public ExternalString {
8882  public:
8883   static const bool kHasOneByteEncoding = false;
8884
8885   typedef v8::String::ExternalStringResource Resource;
8886
8887   // The underlying string resource.
8888   inline const Resource* resource();
8889   inline void set_resource(const Resource* buffer);
8890
8891   // Update the pointer cache to the external character array.
8892   // The cached pointer is always valid, as the external character array does =
8893   // not move during lifetime.  Deserialization is the only exception, after
8894   // which the pointer cache has to be refreshed.
8895   inline void update_data_cache();
8896
8897   inline const uint16_t* GetChars();
8898
8899   // Dispatched behavior.
8900   inline uint16_t ExternalTwoByteStringGet(int index);
8901
8902   // For regexp code.
8903   inline const uint16_t* ExternalTwoByteStringGetData(unsigned start);
8904
8905   DECLARE_CAST(ExternalTwoByteString)
8906
8907   // Garbage collection support.
8908   inline void ExternalTwoByteStringIterateBody(ObjectVisitor* v);
8909
8910   template<typename StaticVisitor>
8911   inline void ExternalTwoByteStringIterateBody();
8912
8913  private:
8914   DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString);
8915 };
8916
8917
8918 // Utility superclass for stack-allocated objects that must be updated
8919 // on gc.  It provides two ways for the gc to update instances, either
8920 // iterating or updating after gc.
8921 class Relocatable BASE_EMBEDDED {
8922  public:
8923   explicit inline Relocatable(Isolate* isolate);
8924   inline virtual ~Relocatable();
8925   virtual void IterateInstance(ObjectVisitor* v) { }
8926   virtual void PostGarbageCollection() { }
8927
8928   static void PostGarbageCollectionProcessing(Isolate* isolate);
8929   static int ArchiveSpacePerThread();
8930   static char* ArchiveState(Isolate* isolate, char* to);
8931   static char* RestoreState(Isolate* isolate, char* from);
8932   static void Iterate(Isolate* isolate, ObjectVisitor* v);
8933   static void Iterate(ObjectVisitor* v, Relocatable* top);
8934   static char* Iterate(ObjectVisitor* v, char* t);
8935
8936  private:
8937   Isolate* isolate_;
8938   Relocatable* prev_;
8939 };
8940
8941
8942 // A flat string reader provides random access to the contents of a
8943 // string independent of the character width of the string.  The handle
8944 // must be valid as long as the reader is being used.
8945 class FlatStringReader : public Relocatable {
8946  public:
8947   FlatStringReader(Isolate* isolate, Handle<String> str);
8948   FlatStringReader(Isolate* isolate, Vector<const char> input);
8949   void PostGarbageCollection();
8950   inline uc32 Get(int index);
8951   template <typename Char>
8952   inline Char Get(int index);
8953   int length() { return length_; }
8954  private:
8955   String** str_;
8956   bool is_one_byte_;
8957   int length_;
8958   const void* start_;
8959 };
8960
8961
8962 // This maintains an off-stack representation of the stack frames required
8963 // to traverse a ConsString, allowing an entirely iterative and restartable
8964 // traversal of the entire string
8965 class ConsStringIterator {
8966  public:
8967   inline ConsStringIterator() {}
8968   inline explicit ConsStringIterator(ConsString* cons_string, int offset = 0) {
8969     Reset(cons_string, offset);
8970   }
8971   inline void Reset(ConsString* cons_string, int offset = 0) {
8972     depth_ = 0;
8973     // Next will always return NULL.
8974     if (cons_string == NULL) return;
8975     Initialize(cons_string, offset);
8976   }
8977   // Returns NULL when complete.
8978   inline String* Next(int* offset_out) {
8979     *offset_out = 0;
8980     if (depth_ == 0) return NULL;
8981     return Continue(offset_out);
8982   }
8983
8984  private:
8985   static const int kStackSize = 32;
8986   // Use a mask instead of doing modulo operations for stack wrapping.
8987   static const int kDepthMask = kStackSize-1;
8988   STATIC_ASSERT(IS_POWER_OF_TWO(kStackSize));
8989   static inline int OffsetForDepth(int depth);
8990
8991   inline void PushLeft(ConsString* string);
8992   inline void PushRight(ConsString* string);
8993   inline void AdjustMaximumDepth();
8994   inline void Pop();
8995   inline bool StackBlown() { return maximum_depth_ - depth_ == kStackSize; }
8996   void Initialize(ConsString* cons_string, int offset);
8997   String* Continue(int* offset_out);
8998   String* NextLeaf(bool* blew_stack);
8999   String* Search(int* offset_out);
9000
9001   // Stack must always contain only frames for which right traversal
9002   // has not yet been performed.
9003   ConsString* frames_[kStackSize];
9004   ConsString* root_;
9005   int depth_;
9006   int maximum_depth_;
9007   int consumed_;
9008   DISALLOW_COPY_AND_ASSIGN(ConsStringIterator);
9009 };
9010
9011
9012 class StringCharacterStream {
9013  public:
9014   inline StringCharacterStream(String* string,
9015                                int offset = 0);
9016   inline uint16_t GetNext();
9017   inline bool HasMore();
9018   inline void Reset(String* string, int offset = 0);
9019   inline void VisitOneByteString(const uint8_t* chars, int length);
9020   inline void VisitTwoByteString(const uint16_t* chars, int length);
9021
9022  private:
9023   ConsStringIterator iter_;
9024   bool is_one_byte_;
9025   union {
9026     const uint8_t* buffer8_;
9027     const uint16_t* buffer16_;
9028   };
9029   const uint8_t* end_;
9030   DISALLOW_COPY_AND_ASSIGN(StringCharacterStream);
9031 };
9032
9033
9034 template <typename T>
9035 class VectorIterator {
9036  public:
9037   VectorIterator(T* d, int l) : data_(Vector<const T>(d, l)), index_(0) { }
9038   explicit VectorIterator(Vector<const T> data) : data_(data), index_(0) { }
9039   T GetNext() { return data_[index_++]; }
9040   bool has_more() { return index_ < data_.length(); }
9041  private:
9042   Vector<const T> data_;
9043   int index_;
9044 };
9045
9046
9047 // The Oddball describes objects null, undefined, true, and false.
9048 class Oddball: public HeapObject {
9049  public:
9050   // [to_string]: Cached to_string computed at startup.
9051   DECL_ACCESSORS(to_string, String)
9052
9053   // [to_number]: Cached to_number computed at startup.
9054   DECL_ACCESSORS(to_number, Object)
9055
9056   // [typeof]: Cached type_of computed at startup.
9057   DECL_ACCESSORS(type_of, String)
9058
9059   inline byte kind() const;
9060   inline void set_kind(byte kind);
9061
9062   DECLARE_CAST(Oddball)
9063
9064   // Dispatched behavior.
9065   DECLARE_VERIFIER(Oddball)
9066
9067   // Initialize the fields.
9068   static void Initialize(Isolate* isolate, Handle<Oddball> oddball,
9069                          const char* to_string, Handle<Object> to_number,
9070                          const char* type_of, byte kind);
9071
9072   // Layout description.
9073   static const int kToStringOffset = HeapObject::kHeaderSize;
9074   static const int kToNumberOffset = kToStringOffset + kPointerSize;
9075   static const int kTypeOfOffset = kToNumberOffset + kPointerSize;
9076   static const int kKindOffset = kTypeOfOffset + kPointerSize;
9077   static const int kSize = kKindOffset + kPointerSize;
9078
9079   static const byte kFalse = 0;
9080   static const byte kTrue = 1;
9081   static const byte kNotBooleanMask = ~1;
9082   static const byte kTheHole = 2;
9083   static const byte kNull = 3;
9084   static const byte kArgumentMarker = 4;
9085   static const byte kUndefined = 5;
9086   static const byte kUninitialized = 6;
9087   static const byte kOther = 7;
9088   static const byte kException = 8;
9089
9090   typedef FixedBodyDescriptor<kToStringOffset, kTypeOfOffset + kPointerSize,
9091                               kSize> BodyDescriptor;
9092
9093   STATIC_ASSERT(kKindOffset == Internals::kOddballKindOffset);
9094   STATIC_ASSERT(kNull == Internals::kNullOddballKind);
9095   STATIC_ASSERT(kUndefined == Internals::kUndefinedOddballKind);
9096
9097  private:
9098   DISALLOW_IMPLICIT_CONSTRUCTORS(Oddball);
9099 };
9100
9101
9102 class Cell: public HeapObject {
9103  public:
9104   // [value]: value of the cell.
9105   DECL_ACCESSORS(value, Object)
9106
9107   DECLARE_CAST(Cell)
9108
9109   static inline Cell* FromValueAddress(Address value) {
9110     Object* result = FromAddress(value - kValueOffset);
9111     return static_cast<Cell*>(result);
9112   }
9113
9114   inline Address ValueAddress() {
9115     return address() + kValueOffset;
9116   }
9117
9118   // Dispatched behavior.
9119   DECLARE_PRINTER(Cell)
9120   DECLARE_VERIFIER(Cell)
9121
9122   // Layout description.
9123   static const int kValueOffset = HeapObject::kHeaderSize;
9124   static const int kSize = kValueOffset + kPointerSize;
9125
9126   typedef FixedBodyDescriptor<kValueOffset,
9127                               kValueOffset + kPointerSize,
9128                               kSize> BodyDescriptor;
9129
9130  private:
9131   DISALLOW_IMPLICIT_CONSTRUCTORS(Cell);
9132 };
9133
9134
9135 class PropertyCell : public HeapObject {
9136  public:
9137   // [property_details]: details of the global property.
9138   DECL_ACCESSORS(property_details_raw, Object)
9139   // [value]: value of the global property.
9140   DECL_ACCESSORS(value, Object)
9141   // [dependent_code]: dependent code that depends on the type of the global
9142   // property.
9143   DECL_ACCESSORS(dependent_code, DependentCode)
9144
9145   inline PropertyDetails property_details();
9146   inline void set_property_details(PropertyDetails details);
9147
9148   PropertyCellConstantType GetConstantType();
9149
9150   // Computes the new type of the cell's contents for the given value, but
9151   // without actually modifying the details.
9152   static PropertyCellType UpdatedType(Handle<PropertyCell> cell,
9153                                       Handle<Object> value,
9154                                       PropertyDetails details);
9155   static void UpdateCell(Handle<GlobalDictionary> dictionary, int entry,
9156                          Handle<Object> value, PropertyDetails details);
9157
9158   static Handle<PropertyCell> InvalidateEntry(
9159       Handle<GlobalDictionary> dictionary, int entry);
9160
9161   static void SetValueWithInvalidation(Handle<PropertyCell> cell,
9162                                        Handle<Object> new_value);
9163
9164   DECLARE_CAST(PropertyCell)
9165
9166   // Dispatched behavior.
9167   DECLARE_PRINTER(PropertyCell)
9168   DECLARE_VERIFIER(PropertyCell)
9169
9170   // Layout description.
9171   static const int kDetailsOffset = HeapObject::kHeaderSize;
9172   static const int kValueOffset = kDetailsOffset + kPointerSize;
9173   static const int kDependentCodeOffset = kValueOffset + kPointerSize;
9174   static const int kSize = kDependentCodeOffset + kPointerSize;
9175
9176   static const int kPointerFieldsBeginOffset = kValueOffset;
9177   static const int kPointerFieldsEndOffset = kSize;
9178
9179   typedef FixedBodyDescriptor<kValueOffset,
9180                               kSize,
9181                               kSize> BodyDescriptor;
9182
9183  private:
9184   DISALLOW_IMPLICIT_CONSTRUCTORS(PropertyCell);
9185 };
9186
9187
9188 class WeakCell : public HeapObject {
9189  public:
9190   inline Object* value() const;
9191
9192   // This should not be called by anyone except GC.
9193   inline void clear();
9194
9195   // This should not be called by anyone except allocator.
9196   inline void initialize(HeapObject* value);
9197
9198   inline bool cleared() const;
9199
9200   DECL_ACCESSORS(next, Object)
9201
9202   inline void clear_next(Heap* heap);
9203
9204   inline bool next_cleared();
9205
9206   DECLARE_CAST(WeakCell)
9207
9208   DECLARE_PRINTER(WeakCell)
9209   DECLARE_VERIFIER(WeakCell)
9210
9211   // Layout description.
9212   static const int kValueOffset = HeapObject::kHeaderSize;
9213   static const int kNextOffset = kValueOffset + kPointerSize;
9214   static const int kSize = kNextOffset + kPointerSize;
9215
9216   typedef FixedBodyDescriptor<kValueOffset, kSize, kSize> BodyDescriptor;
9217
9218  private:
9219   DISALLOW_IMPLICIT_CONSTRUCTORS(WeakCell);
9220 };
9221
9222
9223 // The JSProxy describes EcmaScript Harmony proxies
9224 class JSProxy: public JSReceiver {
9225  public:
9226   // [handler]: The handler property.
9227   DECL_ACCESSORS(handler, Object)
9228
9229   // [hash]: The hash code property (undefined if not initialized yet).
9230   DECL_ACCESSORS(hash, Object)
9231
9232   DECLARE_CAST(JSProxy)
9233
9234   MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithHandler(
9235       Handle<JSProxy> proxy,
9236       Handle<Object> receiver,
9237       Handle<Name> name);
9238
9239   // If the handler defines an accessor property with a setter, invoke it.
9240   // If it defines an accessor property without a setter, or a data property
9241   // that is read-only, throw. In all these cases set '*done' to true,
9242   // otherwise set it to false.
9243   MUST_USE_RESULT
9244   static MaybeHandle<Object> SetPropertyViaPrototypesWithHandler(
9245       Handle<JSProxy> proxy, Handle<Object> receiver, Handle<Name> name,
9246       Handle<Object> value, LanguageMode language_mode, bool* done);
9247
9248   MUST_USE_RESULT static Maybe<PropertyAttributes>
9249       GetPropertyAttributesWithHandler(Handle<JSProxy> proxy,
9250                                        Handle<Object> receiver,
9251                                        Handle<Name> name);
9252   MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithHandler(
9253       Handle<JSProxy> proxy, Handle<Object> receiver, Handle<Name> name,
9254       Handle<Object> value, LanguageMode language_mode);
9255
9256   // Turn the proxy into an (empty) JSObject.
9257   static void Fix(Handle<JSProxy> proxy);
9258
9259   // Initializes the body after the handler slot.
9260   inline void InitializeBody(int object_size, Object* value);
9261
9262   // Invoke a trap by name. If the trap does not exist on this's handler,
9263   // but derived_trap is non-NULL, invoke that instead.  May cause GC.
9264   MUST_USE_RESULT static MaybeHandle<Object> CallTrap(
9265       Handle<JSProxy> proxy,
9266       const char* name,
9267       Handle<Object> derived_trap,
9268       int argc,
9269       Handle<Object> args[]);
9270
9271   // Dispatched behavior.
9272   DECLARE_PRINTER(JSProxy)
9273   DECLARE_VERIFIER(JSProxy)
9274
9275   // Layout description. We add padding so that a proxy has the same
9276   // size as a virgin JSObject. This is essential for becoming a JSObject
9277   // upon freeze.
9278   static const int kHandlerOffset = HeapObject::kHeaderSize;
9279   static const int kHashOffset = kHandlerOffset + kPointerSize;
9280   static const int kPaddingOffset = kHashOffset + kPointerSize;
9281   static const int kSize = JSObject::kHeaderSize;
9282   static const int kHeaderSize = kPaddingOffset;
9283   static const int kPaddingSize = kSize - kPaddingOffset;
9284
9285   STATIC_ASSERT(kPaddingSize >= 0);
9286
9287   typedef FixedBodyDescriptor<kHandlerOffset,
9288                               kPaddingOffset,
9289                               kSize> BodyDescriptor;
9290
9291  private:
9292   friend class JSReceiver;
9293
9294   MUST_USE_RESULT static Maybe<bool> HasPropertyWithHandler(
9295       Handle<JSProxy> proxy, Handle<Name> name);
9296
9297   MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyWithHandler(
9298       Handle<JSProxy> proxy, Handle<Name> name, LanguageMode language_mode);
9299
9300   MUST_USE_RESULT Object* GetIdentityHash();
9301
9302   static Handle<Smi> GetOrCreateIdentityHash(Handle<JSProxy> proxy);
9303
9304   DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy);
9305 };
9306
9307
9308 class JSFunctionProxy: public JSProxy {
9309  public:
9310   // [call_trap]: The call trap.
9311   DECL_ACCESSORS(call_trap, JSReceiver)
9312
9313   // [construct_trap]: The construct trap.
9314   DECL_ACCESSORS(construct_trap, Object)
9315
9316   DECLARE_CAST(JSFunctionProxy)
9317
9318   // Dispatched behavior.
9319   DECLARE_PRINTER(JSFunctionProxy)
9320   DECLARE_VERIFIER(JSFunctionProxy)
9321
9322   // Layout description.
9323   static const int kCallTrapOffset = JSProxy::kPaddingOffset;
9324   static const int kConstructTrapOffset = kCallTrapOffset + kPointerSize;
9325   static const int kPaddingOffset = kConstructTrapOffset + kPointerSize;
9326   static const int kSize = JSFunction::kSize;
9327   static const int kPaddingSize = kSize - kPaddingOffset;
9328
9329   STATIC_ASSERT(kPaddingSize >= 0);
9330
9331   typedef FixedBodyDescriptor<kHandlerOffset,
9332                               kConstructTrapOffset + kPointerSize,
9333                               kSize> BodyDescriptor;
9334
9335  private:
9336   DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunctionProxy);
9337 };
9338
9339
9340 class JSCollection : public JSObject {
9341  public:
9342   // [table]: the backing hash table
9343   DECL_ACCESSORS(table, Object)
9344
9345   static const int kTableOffset = JSObject::kHeaderSize;
9346   static const int kSize = kTableOffset + kPointerSize;
9347
9348  private:
9349   DISALLOW_IMPLICIT_CONSTRUCTORS(JSCollection);
9350 };
9351
9352
9353 // The JSSet describes EcmaScript Harmony sets
9354 class JSSet : public JSCollection {
9355  public:
9356   DECLARE_CAST(JSSet)
9357
9358   static void Initialize(Handle<JSSet> set, Isolate* isolate);
9359   static void Clear(Handle<JSSet> set);
9360
9361   // Dispatched behavior.
9362   DECLARE_PRINTER(JSSet)
9363   DECLARE_VERIFIER(JSSet)
9364
9365  private:
9366   DISALLOW_IMPLICIT_CONSTRUCTORS(JSSet);
9367 };
9368
9369
9370 // The JSMap describes EcmaScript Harmony maps
9371 class JSMap : public JSCollection {
9372  public:
9373   DECLARE_CAST(JSMap)
9374
9375   static void Initialize(Handle<JSMap> map, Isolate* isolate);
9376   static void Clear(Handle<JSMap> map);
9377
9378   // Dispatched behavior.
9379   DECLARE_PRINTER(JSMap)
9380   DECLARE_VERIFIER(JSMap)
9381
9382  private:
9383   DISALLOW_IMPLICIT_CONSTRUCTORS(JSMap);
9384 };
9385
9386
9387 // OrderedHashTableIterator is an iterator that iterates over the keys and
9388 // values of an OrderedHashTable.
9389 //
9390 // The iterator has a reference to the underlying OrderedHashTable data,
9391 // [table], as well as the current [index] the iterator is at.
9392 //
9393 // When the OrderedHashTable is rehashed it adds a reference from the old table
9394 // to the new table as well as storing enough data about the changes so that the
9395 // iterator [index] can be adjusted accordingly.
9396 //
9397 // When the [Next] result from the iterator is requested, the iterator checks if
9398 // there is a newer table that it needs to transition to.
9399 template<class Derived, class TableType>
9400 class OrderedHashTableIterator: public JSObject {
9401  public:
9402   // [table]: the backing hash table mapping keys to values.
9403   DECL_ACCESSORS(table, Object)
9404
9405   // [index]: The index into the data table.
9406   DECL_ACCESSORS(index, Object)
9407
9408   // [kind]: The kind of iteration this is. One of the [Kind] enum values.
9409   DECL_ACCESSORS(kind, Object)
9410
9411 #ifdef OBJECT_PRINT
9412   void OrderedHashTableIteratorPrint(std::ostream& os);  // NOLINT
9413 #endif
9414
9415   static const int kTableOffset = JSObject::kHeaderSize;
9416   static const int kIndexOffset = kTableOffset + kPointerSize;
9417   static const int kKindOffset = kIndexOffset + kPointerSize;
9418   static const int kSize = kKindOffset + kPointerSize;
9419
9420   enum Kind {
9421     kKindKeys = 1,
9422     kKindValues = 2,
9423     kKindEntries = 3
9424   };
9425
9426   // Whether the iterator has more elements. This needs to be called before
9427   // calling |CurrentKey| and/or |CurrentValue|.
9428   bool HasMore();
9429
9430   // Move the index forward one.
9431   void MoveNext() {
9432     set_index(Smi::FromInt(Smi::cast(index())->value() + 1));
9433   }
9434
9435   // Populates the array with the next key and value and then moves the iterator
9436   // forward.
9437   // This returns the |kind| or 0 if the iterator is already at the end.
9438   Smi* Next(JSArray* value_array);
9439
9440   // Returns the current key of the iterator. This should only be called when
9441   // |HasMore| returns true.
9442   inline Object* CurrentKey();
9443
9444  private:
9445   // Transitions the iterator to the non obsolete backing store. This is a NOP
9446   // if the [table] is not obsolete.
9447   void Transition();
9448
9449   DISALLOW_IMPLICIT_CONSTRUCTORS(OrderedHashTableIterator);
9450 };
9451
9452
9453 class JSSetIterator: public OrderedHashTableIterator<JSSetIterator,
9454                                                      OrderedHashSet> {
9455  public:
9456   // Dispatched behavior.
9457   DECLARE_PRINTER(JSSetIterator)
9458   DECLARE_VERIFIER(JSSetIterator)
9459
9460   DECLARE_CAST(JSSetIterator)
9461
9462   // Called by |Next| to populate the array. This allows the subclasses to
9463   // populate the array differently.
9464   inline void PopulateValueArray(FixedArray* array);
9465
9466  private:
9467   DISALLOW_IMPLICIT_CONSTRUCTORS(JSSetIterator);
9468 };
9469
9470
9471 class JSMapIterator: public OrderedHashTableIterator<JSMapIterator,
9472                                                      OrderedHashMap> {
9473  public:
9474   // Dispatched behavior.
9475   DECLARE_PRINTER(JSMapIterator)
9476   DECLARE_VERIFIER(JSMapIterator)
9477
9478   DECLARE_CAST(JSMapIterator)
9479
9480   // Called by |Next| to populate the array. This allows the subclasses to
9481   // populate the array differently.
9482   inline void PopulateValueArray(FixedArray* array);
9483
9484  private:
9485   // Returns the current value of the iterator. This should only be called when
9486   // |HasMore| returns true.
9487   inline Object* CurrentValue();
9488
9489   DISALLOW_IMPLICIT_CONSTRUCTORS(JSMapIterator);
9490 };
9491
9492
9493 // ES6 section 25.1.1.3 The IteratorResult Interface
9494 class JSIteratorResult final : public JSObject {
9495  public:
9496   // [done]: This is the result status of an iterator next method call.  If the
9497   // end of the iterator was reached done is true.  If the end was not reached
9498   // done is false and a [value] is available.
9499   DECL_ACCESSORS(done, Object)
9500
9501   // [value]: If [done] is false, this is the current iteration element value.
9502   // If [done] is true, this is the return value of the iterator, if it supplied
9503   // one.  If the iterator does not have a return value, value is undefined.
9504   // In that case, the value property may be absent from the conforming object
9505   // if it does not inherit an explicit value property.
9506   DECL_ACCESSORS(value, Object)
9507
9508   // Dispatched behavior.
9509   DECLARE_PRINTER(JSIteratorResult)
9510   DECLARE_VERIFIER(JSIteratorResult)
9511
9512   DECLARE_CAST(JSIteratorResult)
9513
9514   static const int kValueOffset = JSObject::kHeaderSize;
9515   static const int kDoneOffset = kValueOffset + kPointerSize;
9516   static const int kSize = kDoneOffset + kPointerSize;
9517
9518   // Indices of in-object properties.
9519   static const int kValueIndex = 0;
9520   static const int kDoneIndex = 1;
9521
9522  private:
9523   DISALLOW_IMPLICIT_CONSTRUCTORS(JSIteratorResult);
9524 };
9525
9526
9527 // Base class for both JSWeakMap and JSWeakSet
9528 class JSWeakCollection: public JSObject {
9529  public:
9530   // [table]: the backing hash table mapping keys to values.
9531   DECL_ACCESSORS(table, Object)
9532
9533   // [next]: linked list of encountered weak maps during GC.
9534   DECL_ACCESSORS(next, Object)
9535
9536   static void Initialize(Handle<JSWeakCollection> collection, Isolate* isolate);
9537   static void Set(Handle<JSWeakCollection> collection, Handle<Object> key,
9538                   Handle<Object> value, int32_t hash);
9539   static bool Delete(Handle<JSWeakCollection> collection, Handle<Object> key,
9540                      int32_t hash);
9541
9542   static const int kTableOffset = JSObject::kHeaderSize;
9543   static const int kNextOffset = kTableOffset + kPointerSize;
9544   static const int kSize = kNextOffset + kPointerSize;
9545
9546  private:
9547   DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection);
9548 };
9549
9550
9551 // The JSWeakMap describes EcmaScript Harmony weak maps
9552 class JSWeakMap: public JSWeakCollection {
9553  public:
9554   DECLARE_CAST(JSWeakMap)
9555
9556   // Dispatched behavior.
9557   DECLARE_PRINTER(JSWeakMap)
9558   DECLARE_VERIFIER(JSWeakMap)
9559
9560  private:
9561   DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakMap);
9562 };
9563
9564
9565 // The JSWeakSet describes EcmaScript Harmony weak sets
9566 class JSWeakSet: public JSWeakCollection {
9567  public:
9568   DECLARE_CAST(JSWeakSet)
9569
9570   // Dispatched behavior.
9571   DECLARE_PRINTER(JSWeakSet)
9572   DECLARE_VERIFIER(JSWeakSet)
9573
9574  private:
9575   DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakSet);
9576 };
9577
9578
9579 // Whether a JSArrayBuffer is a SharedArrayBuffer or not.
9580 enum class SharedFlag { kNotShared, kShared };
9581
9582
9583 class JSArrayBuffer: public JSObject {
9584  public:
9585   // [backing_store]: backing memory for this array
9586   DECL_ACCESSORS(backing_store, void)
9587
9588   // [byte_length]: length in bytes
9589   DECL_ACCESSORS(byte_length, Object)
9590
9591   inline uint32_t bit_field() const;
9592   inline void set_bit_field(uint32_t bits);
9593
9594   inline bool is_external();
9595   inline void set_is_external(bool value);
9596
9597   inline bool is_neuterable();
9598   inline void set_is_neuterable(bool value);
9599
9600   inline bool was_neutered();
9601   inline void set_was_neutered(bool value);
9602
9603   inline bool is_shared();
9604   inline void set_is_shared(bool value);
9605
9606   DECLARE_CAST(JSArrayBuffer)
9607
9608   void Neuter();
9609
9610   static void Setup(Handle<JSArrayBuffer> array_buffer, Isolate* isolate,
9611                     bool is_external, void* data, size_t allocated_length,
9612                     SharedFlag shared = SharedFlag::kNotShared);
9613
9614   static bool SetupAllocatingData(Handle<JSArrayBuffer> array_buffer,
9615                                   Isolate* isolate, size_t allocated_length,
9616                                   bool initialize = true,
9617                                   SharedFlag shared = SharedFlag::kNotShared);
9618
9619   // Dispatched behavior.
9620   DECLARE_PRINTER(JSArrayBuffer)
9621   DECLARE_VERIFIER(JSArrayBuffer)
9622
9623   static const int kBackingStoreOffset = JSObject::kHeaderSize;
9624   static const int kByteLengthOffset = kBackingStoreOffset + kPointerSize;
9625   static const int kBitFieldSlot = kByteLengthOffset + kPointerSize;
9626 #if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT
9627   static const int kBitFieldOffset = kBitFieldSlot;
9628 #else
9629   static const int kBitFieldOffset = kBitFieldSlot + kIntSize;
9630 #endif
9631   static const int kSize = kBitFieldSlot + kPointerSize;
9632
9633   static const int kSizeWithInternalFields =
9634       kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize;
9635
9636   class IsExternal : public BitField<bool, 1, 1> {};
9637   class IsNeuterable : public BitField<bool, 2, 1> {};
9638   class WasNeutered : public BitField<bool, 3, 1> {};
9639   class IsShared : public BitField<bool, 4, 1> {};
9640
9641  private:
9642   DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer);
9643 };
9644
9645
9646 class JSArrayBufferView: public JSObject {
9647  public:
9648   // [buffer]: ArrayBuffer that this typed array views.
9649   DECL_ACCESSORS(buffer, Object)
9650
9651   // [byte_offset]: offset of typed array in bytes.
9652   DECL_ACCESSORS(byte_offset, Object)
9653
9654   // [byte_length]: length of typed array in bytes.
9655   DECL_ACCESSORS(byte_length, Object)
9656
9657   DECLARE_CAST(JSArrayBufferView)
9658
9659   DECLARE_VERIFIER(JSArrayBufferView)
9660
9661   inline bool WasNeutered() const;
9662
9663   static const int kBufferOffset = JSObject::kHeaderSize;
9664   static const int kByteOffsetOffset = kBufferOffset + kPointerSize;
9665   static const int kByteLengthOffset = kByteOffsetOffset + kPointerSize;
9666   static const int kViewSize = kByteLengthOffset + kPointerSize;
9667
9668  private:
9669 #ifdef VERIFY_HEAP
9670   DECL_ACCESSORS(raw_byte_offset, Object)
9671   DECL_ACCESSORS(raw_byte_length, Object)
9672 #endif
9673
9674   DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBufferView);
9675 };
9676
9677
9678 class JSTypedArray: public JSArrayBufferView {
9679  public:
9680   // [length]: length of typed array in elements.
9681   DECL_ACCESSORS(length, Object)
9682   inline uint32_t length_value() const;
9683
9684   DECLARE_CAST(JSTypedArray)
9685
9686   ExternalArrayType type();
9687   size_t element_size();
9688
9689   Handle<JSArrayBuffer> GetBuffer();
9690
9691   // Dispatched behavior.
9692   DECLARE_PRINTER(JSTypedArray)
9693   DECLARE_VERIFIER(JSTypedArray)
9694
9695   static const int kLengthOffset = kViewSize + kPointerSize;
9696   static const int kSize = kLengthOffset + kPointerSize;
9697
9698   static const int kSizeWithInternalFields =
9699       kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize;
9700
9701  private:
9702   static Handle<JSArrayBuffer> MaterializeArrayBuffer(
9703       Handle<JSTypedArray> typed_array);
9704 #ifdef VERIFY_HEAP
9705   DECL_ACCESSORS(raw_length, Object)
9706 #endif
9707
9708   DISALLOW_IMPLICIT_CONSTRUCTORS(JSTypedArray);
9709 };
9710
9711
9712 class JSDataView: public JSArrayBufferView {
9713  public:
9714   DECLARE_CAST(JSDataView)
9715
9716   // Dispatched behavior.
9717   DECLARE_PRINTER(JSDataView)
9718   DECLARE_VERIFIER(JSDataView)
9719
9720   static const int kSize = kViewSize;
9721
9722   static const int kSizeWithInternalFields =
9723       kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize;
9724
9725  private:
9726   DISALLOW_IMPLICIT_CONSTRUCTORS(JSDataView);
9727 };
9728
9729
9730 // Foreign describes objects pointing from JavaScript to C structures.
9731 class Foreign: public HeapObject {
9732  public:
9733   // [address]: field containing the address.
9734   inline Address foreign_address();
9735   inline void set_foreign_address(Address value);
9736
9737   DECLARE_CAST(Foreign)
9738
9739   // Dispatched behavior.
9740   inline void ForeignIterateBody(ObjectVisitor* v);
9741
9742   template<typename StaticVisitor>
9743   inline void ForeignIterateBody();
9744
9745   // Dispatched behavior.
9746   DECLARE_PRINTER(Foreign)
9747   DECLARE_VERIFIER(Foreign)
9748
9749   // Layout description.
9750
9751   static const int kForeignAddressOffset = HeapObject::kHeaderSize;
9752   static const int kSize = kForeignAddressOffset + kPointerSize;
9753
9754   STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset);
9755
9756  private:
9757   DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign);
9758 };
9759
9760
9761 // The JSArray describes JavaScript Arrays
9762 //  Such an array can be in one of two modes:
9763 //    - fast, backing storage is a FixedArray and length <= elements.length();
9764 //       Please note: push and pop can be used to grow and shrink the array.
9765 //    - slow, backing storage is a HashTable with numbers as keys.
9766 class JSArray: public JSObject {
9767  public:
9768   // [length]: The length property.
9769   DECL_ACCESSORS(length, Object)
9770
9771   // Overload the length setter to skip write barrier when the length
9772   // is set to a smi. This matches the set function on FixedArray.
9773   inline void set_length(Smi* length);
9774
9775   static bool HasReadOnlyLength(Handle<JSArray> array);
9776   static bool WouldChangeReadOnlyLength(Handle<JSArray> array, uint32_t index);
9777   static MaybeHandle<Object> ReadOnlyLengthError(Handle<JSArray> array);
9778
9779   // Initialize the array with the given capacity. The function may
9780   // fail due to out-of-memory situations, but only if the requested
9781   // capacity is non-zero.
9782   static void Initialize(Handle<JSArray> array, int capacity, int length = 0);
9783
9784   // If the JSArray has fast elements, and new_length would result in
9785   // normalization, returns true.
9786   bool SetLengthWouldNormalize(uint32_t new_length);
9787   static inline bool SetLengthWouldNormalize(Heap* heap, uint32_t new_length);
9788
9789   // Initializes the array to a certain length.
9790   inline bool AllowsSetLength();
9791
9792   static void SetLength(Handle<JSArray> array, uint32_t length);
9793   // Same as above but will also queue splice records if |array| is observed.
9794   static MaybeHandle<Object> ObservableSetLength(Handle<JSArray> array,
9795                                                  uint32_t length);
9796
9797   // Set the content of the array to the content of storage.
9798   static inline void SetContent(Handle<JSArray> array,
9799                                 Handle<FixedArrayBase> storage);
9800
9801   DECLARE_CAST(JSArray)
9802
9803   // Dispatched behavior.
9804   DECLARE_PRINTER(JSArray)
9805   DECLARE_VERIFIER(JSArray)
9806
9807   // Number of element slots to pre-allocate for an empty array.
9808   static const int kPreallocatedArrayElements = 4;
9809
9810   // Layout description.
9811   static const int kLengthOffset = JSObject::kHeaderSize;
9812   static const int kSize = kLengthOffset + kPointerSize;
9813
9814  private:
9815   DISALLOW_IMPLICIT_CONSTRUCTORS(JSArray);
9816 };
9817
9818
9819 Handle<Object> CacheInitialJSArrayMaps(Handle<Context> native_context,
9820                                        Handle<Map> initial_map);
9821
9822
9823 // JSRegExpResult is just a JSArray with a specific initial map.
9824 // This initial map adds in-object properties for "index" and "input"
9825 // properties, as assigned by RegExp.prototype.exec, which allows
9826 // faster creation of RegExp exec results.
9827 // This class just holds constants used when creating the result.
9828 // After creation the result must be treated as a JSArray in all regards.
9829 class JSRegExpResult: public JSArray {
9830  public:
9831   // Offsets of object fields.
9832   static const int kIndexOffset = JSArray::kSize;
9833   static const int kInputOffset = kIndexOffset + kPointerSize;
9834   static const int kSize = kInputOffset + kPointerSize;
9835   // Indices of in-object properties.
9836   static const int kIndexIndex = 0;
9837   static const int kInputIndex = 1;
9838  private:
9839   DISALLOW_IMPLICIT_CONSTRUCTORS(JSRegExpResult);
9840 };
9841
9842
9843 class AccessorInfo: public Struct {
9844  public:
9845   DECL_ACCESSORS(name, Object)
9846   DECL_ACCESSORS(flag, Smi)
9847   DECL_ACCESSORS(expected_receiver_type, Object)
9848
9849   inline bool all_can_read();
9850   inline void set_all_can_read(bool value);
9851
9852   inline bool all_can_write();
9853   inline void set_all_can_write(bool value);
9854
9855   inline bool is_special_data_property();
9856   inline void set_is_special_data_property(bool value);
9857
9858   inline PropertyAttributes property_attributes();
9859   inline void set_property_attributes(PropertyAttributes attributes);
9860
9861   // Checks whether the given receiver is compatible with this accessor.
9862   static bool IsCompatibleReceiverMap(Isolate* isolate,
9863                                       Handle<AccessorInfo> info,
9864                                       Handle<Map> map);
9865   inline bool IsCompatibleReceiver(Object* receiver);
9866
9867   DECLARE_CAST(AccessorInfo)
9868
9869   // Dispatched behavior.
9870   DECLARE_VERIFIER(AccessorInfo)
9871
9872   // Append all descriptors to the array that are not already there.
9873   // Return number added.
9874   static int AppendUnique(Handle<Object> descriptors,
9875                           Handle<FixedArray> array,
9876                           int valid_descriptors);
9877
9878   static const int kNameOffset = HeapObject::kHeaderSize;
9879   static const int kFlagOffset = kNameOffset + kPointerSize;
9880   static const int kExpectedReceiverTypeOffset = kFlagOffset + kPointerSize;
9881   static const int kSize = kExpectedReceiverTypeOffset + kPointerSize;
9882
9883  private:
9884   inline bool HasExpectedReceiverType();
9885
9886   // Bit positions in flag.
9887   static const int kAllCanReadBit = 0;
9888   static const int kAllCanWriteBit = 1;
9889   static const int kSpecialDataProperty = 2;
9890   class AttributesField : public BitField<PropertyAttributes, 3, 3> {};
9891
9892   DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorInfo);
9893 };
9894
9895
9896 // An accessor must have a getter, but can have no setter.
9897 //
9898 // When setting a property, V8 searches accessors in prototypes.
9899 // If an accessor was found and it does not have a setter,
9900 // the request is ignored.
9901 //
9902 // If the accessor in the prototype has the READ_ONLY property attribute, then
9903 // a new value is added to the derived object when the property is set.
9904 // This shadows the accessor in the prototype.
9905 class ExecutableAccessorInfo: public AccessorInfo {
9906  public:
9907   DECL_ACCESSORS(getter, Object)
9908   DECL_ACCESSORS(setter, Object)
9909   DECL_ACCESSORS(data, Object)
9910
9911   DECLARE_CAST(ExecutableAccessorInfo)
9912
9913   // Dispatched behavior.
9914   DECLARE_PRINTER(ExecutableAccessorInfo)
9915   DECLARE_VERIFIER(ExecutableAccessorInfo)
9916
9917   static const int kGetterOffset = AccessorInfo::kSize;
9918   static const int kSetterOffset = kGetterOffset + kPointerSize;
9919   static const int kDataOffset = kSetterOffset + kPointerSize;
9920   static const int kSize = kDataOffset + kPointerSize;
9921
9922   static void ClearSetter(Handle<ExecutableAccessorInfo> info);
9923
9924  private:
9925   DISALLOW_IMPLICIT_CONSTRUCTORS(ExecutableAccessorInfo);
9926 };
9927
9928
9929 // Support for JavaScript accessors: A pair of a getter and a setter. Each
9930 // accessor can either be
9931 //   * a pointer to a JavaScript function or proxy: a real accessor
9932 //   * undefined: considered an accessor by the spec, too, strangely enough
9933 //   * the hole: an accessor which has not been set
9934 //   * a pointer to a map: a transition used to ensure map sharing
9935 class AccessorPair: public Struct {
9936  public:
9937   DECL_ACCESSORS(getter, Object)
9938   DECL_ACCESSORS(setter, Object)
9939
9940   DECLARE_CAST(AccessorPair)
9941
9942   static Handle<AccessorPair> Copy(Handle<AccessorPair> pair);
9943
9944   inline Object* get(AccessorComponent component);
9945   inline void set(AccessorComponent component, Object* value);
9946
9947   // Note: Returns undefined instead in case of a hole.
9948   Object* GetComponent(AccessorComponent component);
9949
9950   // Set both components, skipping arguments which are a JavaScript null.
9951   inline void SetComponents(Object* getter, Object* setter);
9952
9953   inline bool Equals(AccessorPair* pair);
9954   inline bool Equals(Object* getter_value, Object* setter_value);
9955
9956   inline bool ContainsAccessor();
9957
9958   // Dispatched behavior.
9959   DECLARE_PRINTER(AccessorPair)
9960   DECLARE_VERIFIER(AccessorPair)
9961
9962   static const int kGetterOffset = HeapObject::kHeaderSize;
9963   static const int kSetterOffset = kGetterOffset + kPointerSize;
9964   static const int kSize = kSetterOffset + kPointerSize;
9965
9966  private:
9967   // Strangely enough, in addition to functions and harmony proxies, the spec
9968   // requires us to consider undefined as a kind of accessor, too:
9969   //    var obj = {};
9970   //    Object.defineProperty(obj, "foo", {get: undefined});
9971   //    assertTrue("foo" in obj);
9972   inline bool IsJSAccessor(Object* obj);
9973
9974   DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorPair);
9975 };
9976
9977
9978 class AccessCheckInfo: public Struct {
9979  public:
9980   DECL_ACCESSORS(named_callback, Object)
9981   DECL_ACCESSORS(indexed_callback, Object)
9982   DECL_ACCESSORS(data, Object)
9983
9984   DECLARE_CAST(AccessCheckInfo)
9985
9986   // Dispatched behavior.
9987   DECLARE_PRINTER(AccessCheckInfo)
9988   DECLARE_VERIFIER(AccessCheckInfo)
9989
9990   static const int kNamedCallbackOffset   = HeapObject::kHeaderSize;
9991   static const int kIndexedCallbackOffset = kNamedCallbackOffset + kPointerSize;
9992   static const int kDataOffset = kIndexedCallbackOffset + kPointerSize;
9993   static const int kSize = kDataOffset + kPointerSize;
9994
9995  private:
9996   DISALLOW_IMPLICIT_CONSTRUCTORS(AccessCheckInfo);
9997 };
9998
9999
10000 class InterceptorInfo: public Struct {
10001  public:
10002   DECL_ACCESSORS(getter, Object)
10003   DECL_ACCESSORS(setter, Object)
10004   DECL_ACCESSORS(query, Object)
10005   DECL_ACCESSORS(deleter, Object)
10006   DECL_ACCESSORS(enumerator, Object)
10007   DECL_ACCESSORS(data, Object)
10008   DECL_BOOLEAN_ACCESSORS(can_intercept_symbols)
10009   DECL_BOOLEAN_ACCESSORS(all_can_read)
10010   DECL_BOOLEAN_ACCESSORS(non_masking)
10011
10012   inline int flags() const;
10013   inline void set_flags(int flags);
10014
10015   DECLARE_CAST(InterceptorInfo)
10016
10017   // Dispatched behavior.
10018   DECLARE_PRINTER(InterceptorInfo)
10019   DECLARE_VERIFIER(InterceptorInfo)
10020
10021   static const int kGetterOffset = HeapObject::kHeaderSize;
10022   static const int kSetterOffset = kGetterOffset + kPointerSize;
10023   static const int kQueryOffset = kSetterOffset + kPointerSize;
10024   static const int kDeleterOffset = kQueryOffset + kPointerSize;
10025   static const int kEnumeratorOffset = kDeleterOffset + kPointerSize;
10026   static const int kDataOffset = kEnumeratorOffset + kPointerSize;
10027   static const int kFlagsOffset = kDataOffset + kPointerSize;
10028   static const int kSize = kFlagsOffset + kPointerSize;
10029
10030   static const int kCanInterceptSymbolsBit = 0;
10031   static const int kAllCanReadBit = 1;
10032   static const int kNonMasking = 2;
10033
10034  private:
10035   DISALLOW_IMPLICIT_CONSTRUCTORS(InterceptorInfo);
10036 };
10037
10038
10039 class CallHandlerInfo: public Struct {
10040  public:
10041   DECL_ACCESSORS(callback, Object)
10042   DECL_ACCESSORS(data, Object)
10043
10044   DECLARE_CAST(CallHandlerInfo)
10045
10046   // Dispatched behavior.
10047   DECLARE_PRINTER(CallHandlerInfo)
10048   DECLARE_VERIFIER(CallHandlerInfo)
10049
10050   static const int kCallbackOffset = HeapObject::kHeaderSize;
10051   static const int kDataOffset = kCallbackOffset + kPointerSize;
10052   static const int kSize = kDataOffset + kPointerSize;
10053
10054  private:
10055   DISALLOW_IMPLICIT_CONSTRUCTORS(CallHandlerInfo);
10056 };
10057
10058
10059 class TemplateInfo: public Struct {
10060  public:
10061   DECL_ACCESSORS(tag, Object)
10062   inline int number_of_properties() const;
10063   inline void set_number_of_properties(int value);
10064   DECL_ACCESSORS(property_list, Object)
10065   DECL_ACCESSORS(property_accessors, Object)
10066
10067   DECLARE_VERIFIER(TemplateInfo)
10068
10069   static const int kTagOffset = HeapObject::kHeaderSize;
10070   static const int kNumberOfProperties = kTagOffset + kPointerSize;
10071   static const int kPropertyListOffset = kNumberOfProperties + kPointerSize;
10072   static const int kPropertyAccessorsOffset =
10073       kPropertyListOffset + kPointerSize;
10074   static const int kHeaderSize = kPropertyAccessorsOffset + kPointerSize;
10075
10076  private:
10077   DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateInfo);
10078 };
10079
10080
10081 class FunctionTemplateInfo: public TemplateInfo {
10082  public:
10083   DECL_ACCESSORS(serial_number, Object)
10084   DECL_ACCESSORS(call_code, Object)
10085   DECL_ACCESSORS(prototype_template, Object)
10086   DECL_ACCESSORS(parent_template, Object)
10087   DECL_ACCESSORS(named_property_handler, Object)
10088   DECL_ACCESSORS(indexed_property_handler, Object)
10089   DECL_ACCESSORS(instance_template, Object)
10090   DECL_ACCESSORS(class_name, Object)
10091   DECL_ACCESSORS(signature, Object)
10092   DECL_ACCESSORS(instance_call_handler, Object)
10093   DECL_ACCESSORS(access_check_info, Object)
10094   DECL_ACCESSORS(flag, Smi)
10095
10096   inline int length() const;
10097   inline void set_length(int value);
10098
10099   // Following properties use flag bits.
10100   DECL_BOOLEAN_ACCESSORS(hidden_prototype)
10101   DECL_BOOLEAN_ACCESSORS(undetectable)
10102   // If the bit is set, object instances created by this function
10103   // requires access check.
10104   DECL_BOOLEAN_ACCESSORS(needs_access_check)
10105   DECL_BOOLEAN_ACCESSORS(read_only_prototype)
10106   DECL_BOOLEAN_ACCESSORS(remove_prototype)
10107   DECL_BOOLEAN_ACCESSORS(do_not_cache)
10108   DECL_BOOLEAN_ACCESSORS(instantiated)
10109   DECL_BOOLEAN_ACCESSORS(accept_any_receiver)
10110
10111   DECLARE_CAST(FunctionTemplateInfo)
10112
10113   // Dispatched behavior.
10114   DECLARE_PRINTER(FunctionTemplateInfo)
10115   DECLARE_VERIFIER(FunctionTemplateInfo)
10116
10117   static const int kSerialNumberOffset = TemplateInfo::kHeaderSize;
10118   static const int kCallCodeOffset = kSerialNumberOffset + kPointerSize;
10119   static const int kPrototypeTemplateOffset =
10120       kCallCodeOffset + kPointerSize;
10121   static const int kParentTemplateOffset =
10122       kPrototypeTemplateOffset + kPointerSize;
10123   static const int kNamedPropertyHandlerOffset =
10124       kParentTemplateOffset + kPointerSize;
10125   static const int kIndexedPropertyHandlerOffset =
10126       kNamedPropertyHandlerOffset + kPointerSize;
10127   static const int kInstanceTemplateOffset =
10128       kIndexedPropertyHandlerOffset + kPointerSize;
10129   static const int kClassNameOffset = kInstanceTemplateOffset + kPointerSize;
10130   static const int kSignatureOffset = kClassNameOffset + kPointerSize;
10131   static const int kInstanceCallHandlerOffset = kSignatureOffset + kPointerSize;
10132   static const int kAccessCheckInfoOffset =
10133       kInstanceCallHandlerOffset + kPointerSize;
10134   static const int kFlagOffset = kAccessCheckInfoOffset + kPointerSize;
10135   static const int kLengthOffset = kFlagOffset + kPointerSize;
10136   static const int kSize = kLengthOffset + kPointerSize;
10137
10138   // Returns true if |object| is an instance of this function template.
10139   bool IsTemplateFor(Object* object);
10140   bool IsTemplateFor(Map* map);
10141
10142   // Returns the holder JSObject if the function can legally be called with this
10143   // receiver.  Returns Heap::null_value() if the call is illegal.
10144   Object* GetCompatibleReceiver(Isolate* isolate, Object* receiver);
10145
10146  private:
10147   // Bit position in the flag, from least significant bit position.
10148   static const int kHiddenPrototypeBit   = 0;
10149   static const int kUndetectableBit      = 1;
10150   static const int kNeedsAccessCheckBit  = 2;
10151   static const int kReadOnlyPrototypeBit = 3;
10152   static const int kRemovePrototypeBit   = 4;
10153   static const int kDoNotCacheBit        = 5;
10154   static const int kInstantiatedBit      = 6;
10155   static const int kAcceptAnyReceiver = 7;
10156
10157   DISALLOW_IMPLICIT_CONSTRUCTORS(FunctionTemplateInfo);
10158 };
10159
10160
10161 class ObjectTemplateInfo: public TemplateInfo {
10162  public:
10163   DECL_ACCESSORS(constructor, Object)
10164   DECL_ACCESSORS(internal_field_count, Object)
10165
10166   DECLARE_CAST(ObjectTemplateInfo)
10167
10168   // Dispatched behavior.
10169   DECLARE_PRINTER(ObjectTemplateInfo)
10170   DECLARE_VERIFIER(ObjectTemplateInfo)
10171
10172   static const int kConstructorOffset = TemplateInfo::kHeaderSize;
10173   static const int kInternalFieldCountOffset =
10174       kConstructorOffset + kPointerSize;
10175   static const int kSize = kInternalFieldCountOffset + kPointerSize;
10176 };
10177
10178
10179 class TypeSwitchInfo: public Struct {
10180  public:
10181   DECL_ACCESSORS(types, Object)
10182
10183   DECLARE_CAST(TypeSwitchInfo)
10184
10185   // Dispatched behavior.
10186   DECLARE_PRINTER(TypeSwitchInfo)
10187   DECLARE_VERIFIER(TypeSwitchInfo)
10188
10189   static const int kTypesOffset = Struct::kHeaderSize;
10190   static const int kSize        = kTypesOffset + kPointerSize;
10191 };
10192
10193
10194 // The DebugInfo class holds additional information for a function being
10195 // debugged.
10196 class DebugInfo: public Struct {
10197  public:
10198   // The shared function info for the source being debugged.
10199   DECL_ACCESSORS(shared, SharedFunctionInfo)
10200   // Code object for the patched code. This code object is the code object
10201   // currently active for the function.
10202   DECL_ACCESSORS(code, Code)
10203   // Fixed array holding status information for each active break point.
10204   DECL_ACCESSORS(break_points, FixedArray)
10205
10206   // Check if there is a break point at a code position.
10207   bool HasBreakPoint(int code_position);
10208   // Get the break point info object for a code position.
10209   Object* GetBreakPointInfo(int code_position);
10210   // Clear a break point.
10211   static void ClearBreakPoint(Handle<DebugInfo> debug_info,
10212                               int code_position,
10213                               Handle<Object> break_point_object);
10214   // Set a break point.
10215   static void SetBreakPoint(Handle<DebugInfo> debug_info, int code_position,
10216                             int source_position, int statement_position,
10217                             Handle<Object> break_point_object);
10218   // Get the break point objects for a code position.
10219   Handle<Object> GetBreakPointObjects(int code_position);
10220   // Find the break point info holding this break point object.
10221   static Handle<Object> FindBreakPointInfo(Handle<DebugInfo> debug_info,
10222                                            Handle<Object> break_point_object);
10223   // Get the number of break points for this function.
10224   int GetBreakPointCount();
10225
10226   DECLARE_CAST(DebugInfo)
10227
10228   // Dispatched behavior.
10229   DECLARE_PRINTER(DebugInfo)
10230   DECLARE_VERIFIER(DebugInfo)
10231
10232   static const int kSharedFunctionInfoIndex = Struct::kHeaderSize;
10233   static const int kCodeIndex = kSharedFunctionInfoIndex + kPointerSize;
10234   static const int kBreakPointsStateIndex = kCodeIndex + kPointerSize;
10235   static const int kSize = kBreakPointsStateIndex + kPointerSize;
10236
10237   static const int kEstimatedNofBreakPointsInFunction = 16;
10238
10239  private:
10240   static const int kNoBreakPointInfo = -1;
10241
10242   // Lookup the index in the break_points array for a code position.
10243   int GetBreakPointInfoIndex(int code_position);
10244
10245   DISALLOW_IMPLICIT_CONSTRUCTORS(DebugInfo);
10246 };
10247
10248
10249 // The BreakPointInfo class holds information for break points set in a
10250 // function. The DebugInfo object holds a BreakPointInfo object for each code
10251 // position with one or more break points.
10252 class BreakPointInfo: public Struct {
10253  public:
10254   // The position in the code for the break point.
10255   DECL_ACCESSORS(code_position, Smi)
10256   // The position in the source for the break position.
10257   DECL_ACCESSORS(source_position, Smi)
10258   // The position in the source for the last statement before this break
10259   // position.
10260   DECL_ACCESSORS(statement_position, Smi)
10261   // List of related JavaScript break points.
10262   DECL_ACCESSORS(break_point_objects, Object)
10263
10264   // Removes a break point.
10265   static void ClearBreakPoint(Handle<BreakPointInfo> info,
10266                               Handle<Object> break_point_object);
10267   // Set a break point.
10268   static void SetBreakPoint(Handle<BreakPointInfo> info,
10269                             Handle<Object> break_point_object);
10270   // Check if break point info has this break point object.
10271   static bool HasBreakPointObject(Handle<BreakPointInfo> info,
10272                                   Handle<Object> break_point_object);
10273   // Get the number of break points for this code position.
10274   int GetBreakPointCount();
10275
10276   DECLARE_CAST(BreakPointInfo)
10277
10278   // Dispatched behavior.
10279   DECLARE_PRINTER(BreakPointInfo)
10280   DECLARE_VERIFIER(BreakPointInfo)
10281
10282   static const int kCodePositionIndex = Struct::kHeaderSize;
10283   static const int kSourcePositionIndex = kCodePositionIndex + kPointerSize;
10284   static const int kStatementPositionIndex =
10285       kSourcePositionIndex + kPointerSize;
10286   static const int kBreakPointObjectsIndex =
10287       kStatementPositionIndex + kPointerSize;
10288   static const int kSize = kBreakPointObjectsIndex + kPointerSize;
10289
10290  private:
10291   DISALLOW_IMPLICIT_CONSTRUCTORS(BreakPointInfo);
10292 };
10293
10294
10295 #undef DECL_BOOLEAN_ACCESSORS
10296 #undef DECL_ACCESSORS
10297 #undef DECLARE_CAST
10298 #undef DECLARE_VERIFIER
10299
10300 #define VISITOR_SYNCHRONIZATION_TAGS_LIST(V)                               \
10301   V(kStringTable, "string_table", "(Internalized strings)")                \
10302   V(kExternalStringsTable, "external_strings_table", "(External strings)") \
10303   V(kStrongRootList, "strong_root_list", "(Strong roots)")                 \
10304   V(kSmiRootList, "smi_root_list", "(Smi roots)")                          \
10305   V(kBootstrapper, "bootstrapper", "(Bootstrapper)")                       \
10306   V(kTop, "top", "(Isolate)")                                              \
10307   V(kRelocatable, "relocatable", "(Relocatable)")                          \
10308   V(kDebug, "debug", "(Debugger)")                                         \
10309   V(kCompilationCache, "compilationcache", "(Compilation cache)")          \
10310   V(kHandleScope, "handlescope", "(Handle scope)")                         \
10311   V(kBuiltins, "builtins", "(Builtins)")                                   \
10312   V(kGlobalHandles, "globalhandles", "(Global handles)")                   \
10313   V(kEternalHandles, "eternalhandles", "(Eternal handles)")                \
10314   V(kThreadManager, "threadmanager", "(Thread manager)")                   \
10315   V(kStrongRoots, "strong roots", "(Strong roots)")                        \
10316   V(kExtensions, "Extensions", "(Extensions)")
10317
10318 class VisitorSynchronization : public AllStatic {
10319  public:
10320 #define DECLARE_ENUM(enum_item, ignore1, ignore2) enum_item,
10321   enum SyncTag {
10322     VISITOR_SYNCHRONIZATION_TAGS_LIST(DECLARE_ENUM)
10323     kNumberOfSyncTags
10324   };
10325 #undef DECLARE_ENUM
10326
10327   static const char* const kTags[kNumberOfSyncTags];
10328   static const char* const kTagNames[kNumberOfSyncTags];
10329 };
10330
10331 // Abstract base class for visiting, and optionally modifying, the
10332 // pointers contained in Objects. Used in GC and serialization/deserialization.
10333 class ObjectVisitor BASE_EMBEDDED {
10334  public:
10335   virtual ~ObjectVisitor() {}
10336
10337   // Visits a contiguous arrays of pointers in the half-open range
10338   // [start, end). Any or all of the values may be modified on return.
10339   virtual void VisitPointers(Object** start, Object** end) = 0;
10340
10341   // Handy shorthand for visiting a single pointer.
10342   virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); }
10343
10344   // Visit weak next_code_link in Code object.
10345   virtual void VisitNextCodeLink(Object** p) { VisitPointers(p, p + 1); }
10346
10347   // To allow lazy clearing of inline caches the visitor has
10348   // a rich interface for iterating over Code objects..
10349
10350   // Visits a code target in the instruction stream.
10351   virtual void VisitCodeTarget(RelocInfo* rinfo);
10352
10353   // Visits a code entry in a JS function.
10354   virtual void VisitCodeEntry(Address entry_address);
10355
10356   // Visits a global property cell reference in the instruction stream.
10357   virtual void VisitCell(RelocInfo* rinfo);
10358
10359   // Visits a runtime entry in the instruction stream.
10360   virtual void VisitRuntimeEntry(RelocInfo* rinfo) {}
10361
10362   // Visits the resource of an one-byte or two-byte string.
10363   virtual void VisitExternalOneByteString(
10364       v8::String::ExternalOneByteStringResource** resource) {}
10365   virtual void VisitExternalTwoByteString(
10366       v8::String::ExternalStringResource** resource) {}
10367
10368   // Visits a debug call target in the instruction stream.
10369   virtual void VisitDebugTarget(RelocInfo* rinfo);
10370
10371   // Visits the byte sequence in a function's prologue that contains information
10372   // about the code's age.
10373   virtual void VisitCodeAgeSequence(RelocInfo* rinfo);
10374
10375   // Visit pointer embedded into a code object.
10376   virtual void VisitEmbeddedPointer(RelocInfo* rinfo);
10377
10378   // Visits an external reference embedded into a code object.
10379   virtual void VisitExternalReference(RelocInfo* rinfo);
10380
10381   // Visits an external reference.
10382   virtual void VisitExternalReference(Address* p) {}
10383
10384   // Visits an (encoded) internal reference.
10385   virtual void VisitInternalReference(RelocInfo* rinfo) {}
10386
10387   // Visits a handle that has an embedder-assigned class ID.
10388   virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {}
10389
10390   // Intended for serialization/deserialization checking: insert, or
10391   // check for the presence of, a tag at this position in the stream.
10392   // Also used for marking up GC roots in heap snapshots.
10393   virtual void Synchronize(VisitorSynchronization::SyncTag tag) {}
10394 };
10395
10396
10397 class StructBodyDescriptor : public
10398   FlexibleBodyDescriptor<HeapObject::kHeaderSize> {
10399  public:
10400   static inline int SizeOf(Map* map, HeapObject* object);
10401 };
10402
10403
10404 // BooleanBit is a helper class for setting and getting a bit in an
10405 // integer or Smi.
10406 class BooleanBit : public AllStatic {
10407  public:
10408   static inline bool get(Smi* smi, int bit_position) {
10409     return get(smi->value(), bit_position);
10410   }
10411
10412   static inline bool get(int value, int bit_position) {
10413     return (value & (1 << bit_position)) != 0;
10414   }
10415
10416   static inline Smi* set(Smi* smi, int bit_position, bool v) {
10417     return Smi::FromInt(set(smi->value(), bit_position, v));
10418   }
10419
10420   static inline int set(int value, int bit_position, bool v) {
10421     if (v) {
10422       value |= (1 << bit_position);
10423     } else {
10424       value &= ~(1 << bit_position);
10425     }
10426     return value;
10427   }
10428 };
10429
10430 } }  // namespace v8::internal
10431
10432 #endif  // V8_OBJECTS_H_