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