13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_CONTEXTS_H_
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_CONTEXTS_H_
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/objects.h"
1080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass RegExpMatchInfo;
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum ContextLookupFlags {
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOLLOW_CONTEXT_CHAIN = 1 << 0,
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOLLOW_PROTOTYPE_CHAIN = 1 << 1,
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  STOP_AT_DECLARATION_SCOPE = 1 << 2,
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SKIP_WITH_CONTEXT = 1 << 3,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  DONT_FOLLOW_CHAINS = 0,
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOLLOW_CHAINS = FOLLOW_CONTEXT_CHAIN | FOLLOW_PROTOTYPE_CHAIN,
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LEXICAL_TEST =
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOLLOW_CONTEXT_CHAIN | STOP_AT_DECLARATION_SCOPE | SKIP_WITH_CONTEXT,
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Heap-allocated activation contexts.
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Contexts are implemented as FixedArray objects; the Context
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// class is a convenience interface casted on a FixedArray object.
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Note: Context must have no virtual functions and Context objects
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// must always be allocated via Heap::AllocateContext() or
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Factory::NewContext.
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define NATIVE_CONTEXT_INTRINSIC_FUNCTIONS(V)                           \
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FUNCTION_AWAIT_CAUGHT_INDEX, JSFunction,                      \
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    async_function_await_caught)                                        \
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FUNCTION_AWAIT_UNCAUGHT_INDEX, JSFunction,                    \
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    async_function_await_uncaught)                                      \
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FUNCTION_PROMISE_CREATE_INDEX, JSFunction,                    \
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    async_function_promise_create)                                      \
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FUNCTION_PROMISE_RELEASE_INDEX, JSFunction,                   \
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    async_function_promise_release)                                     \
47bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(IS_ARRAYLIKE, JSFunction, is_arraylike)                             \
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V(GENERATOR_NEXT_INTERNAL, JSFunction, generator_next_internal)       \
49bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(GET_TEMPLATE_CALL_SITE_INDEX, JSFunction, get_template_call_site)   \
50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(MAKE_ERROR_INDEX, JSFunction, make_error)                           \
51bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(MAKE_RANGE_ERROR_INDEX, JSFunction, make_range_error)               \
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(MAKE_SYNTAX_ERROR_INDEX, JSFunction, make_syntax_error)             \
53bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(MAKE_TYPE_ERROR_INDEX, JSFunction, make_type_error)                 \
54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(MAKE_URI_ERROR_INDEX, JSFunction, make_uri_error)                   \
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(OBJECT_CREATE, JSFunction, object_create)                           \
56bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_DEFINE_PROPERTIES, JSFunction, object_define_properties)     \
57bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_DEFINE_PROPERTY, JSFunction, object_define_property)         \
58bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_FREEZE, JSFunction, object_freeze)                           \
59bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_GET_PROTOTYPE_OF, JSFunction, object_get_prototype_of)       \
60bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_IS_EXTENSIBLE, JSFunction, object_is_extensible)             \
61bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_IS_FROZEN, JSFunction, object_is_frozen)                     \
62bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_IS_SEALED, JSFunction, object_is_sealed)                     \
63bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(OBJECT_KEYS, JSFunction, object_keys)                               \
64c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(REGEXP_INTERNAL_MATCH, JSFunction, regexp_internal_match)           \
65bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(REFLECT_APPLY_INDEX, JSFunction, reflect_apply)                     \
66bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(REFLECT_CONSTRUCT_INDEX, JSFunction, reflect_construct)             \
67bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(REFLECT_DEFINE_PROPERTY_INDEX, JSFunction, reflect_define_property) \
68bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(REFLECT_DELETE_PROPERTY_INDEX, JSFunction, reflect_delete_property) \
69bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(SPREAD_ARGUMENTS_INDEX, JSFunction, spread_arguments)               \
70bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(SPREAD_ITERABLE_INDEX, JSFunction, spread_iterable)                 \
7113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(MATH_FLOOR_INDEX, JSFunction, math_floor)                           \
72c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(MATH_POW_INDEX, JSFunction, math_pow)                               \
7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(NEW_PROMISE_CAPABILITY_INDEX, JSFunction, new_promise_capability)   \
7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_INTERNAL_CONSTRUCTOR_INDEX, JSFunction,                     \
7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    promise_internal_constructor)                                       \
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_INTERNAL_REJECT_INDEX, JSFunction, promise_internal_reject) \
7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(IS_PROMISE_INDEX, JSFunction, is_promise)                           \
7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_RESOLVE_INDEX, JSFunction, promise_resolve)                 \
7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_THEN_INDEX, JSFunction, promise_then)                       \
8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_HANDLE_INDEX, JSFunction, promise_handle)                   \
8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_HANDLE_REJECT_INDEX, JSFunction, promise_handle_reject)
8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define NATIVE_CONTEXT_IMPORTED_FIELDS(V)                                     \
8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_CONCAT_INDEX, JSFunction, array_concat)                             \
8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_POP_INDEX, JSFunction, array_pop)                                   \
8662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_PUSH_INDEX, JSFunction, array_push)                                 \
8762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_SHIFT_INDEX, JSFunction, array_shift)                               \
8862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_SPLICE_INDEX, JSFunction, array_splice)                             \
8962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_SLICE_INDEX, JSFunction, array_slice)                               \
9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_UNSHIFT_INDEX, JSFunction, array_unshift)                           \
9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_ENTRIES_ITERATOR_INDEX, JSFunction, array_entries_iterator)         \
9262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_FOR_EACH_ITERATOR_INDEX, JSFunction, array_for_each_iterator)       \
9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_KEYS_ITERATOR_INDEX, JSFunction, array_keys_iterator)               \
9462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ARRAY_VALUES_ITERATOR_INDEX, JSFunction, array_values_iterator)           \
9562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(DERIVED_GET_TRAP_INDEX, JSFunction, derived_get_trap)                     \
9662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ERROR_FUNCTION_INDEX, JSFunction, error_function)                         \
9762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ERROR_TO_STRING, JSFunction, error_to_string)                             \
9862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(EVAL_ERROR_FUNCTION_INDEX, JSFunction, eval_error_function)               \
9962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(GLOBAL_EVAL_FUN_INDEX, JSFunction, global_eval_fun)                       \
10062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(GLOBAL_PROXY_FUNCTION_INDEX, JSFunction, global_proxy_function)           \
10162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(MAP_DELETE_METHOD_INDEX, JSFunction, map_delete)                          \
10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(MAP_GET_METHOD_INDEX, JSFunction, map_get)                                \
10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(MAP_HAS_METHOD_INDEX, JSFunction, map_has)                                \
10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(MAP_SET_METHOD_INDEX, JSFunction, map_set)                                \
10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(FUNCTION_HAS_INSTANCE_INDEX, JSFunction, function_has_instance)           \
10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(OBJECT_VALUE_OF, JSFunction, object_value_of)                             \
10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(OBJECT_TO_STRING, JSFunction, object_to_string)                           \
10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_CATCH_INDEX, JSFunction, promise_catch)                           \
10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_FUNCTION_INDEX, JSFunction, promise_function)                     \
11062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(RANGE_ERROR_FUNCTION_INDEX, JSFunction, range_error_function)             \
11162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(REFERENCE_ERROR_FUNCTION_INDEX, JSFunction, reference_error_function)     \
11262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(SET_ADD_METHOD_INDEX, JSFunction, set_add)                                \
11362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(SET_DELETE_METHOD_INDEX, JSFunction, set_delete)                          \
11462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(SET_HAS_METHOD_INDEX, JSFunction, set_has)                                \
11562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(SYNTAX_ERROR_FUNCTION_INDEX, JSFunction, syntax_error_function)           \
11662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TYPE_ERROR_FUNCTION_INDEX, JSFunction, type_error_function)               \
11762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(URI_ERROR_FUNCTION_INDEX, JSFunction, uri_error_function)                 \
11862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_COMPILE_ERROR_FUNCTION_INDEX, JSFunction,                            \
11962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    wasm_compile_error_function)                                              \
12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_LINK_ERROR_FUNCTION_INDEX, JSFunction, wasm_link_error_function)     \
121c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(WASM_RUNTIME_ERROR_FUNCTION_INDEX, JSFunction, wasm_runtime_error_function)
122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#define NATIVE_CONTEXT_JS_ARRAY_ITERATOR_MAPS(V)                               \
124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(TYPED_ARRAY_KEY_ITERATOR_MAP_INDEX, Map, typed_array_key_iterator_map)     \
125c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_ARRAY_KEY_ITERATOR_MAP_INDEX, Map, fast_array_key_iterator_map)       \
126c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(GENERIC_ARRAY_KEY_ITERATOR_MAP_INDEX, Map, array_key_iterator_map)         \
127c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                                               \
128c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                             \
129c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    uint8_array_key_value_iterator_map)                                        \
130c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT8_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                              \
131c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    int8_array_key_value_iterator_map)                                         \
132c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT16_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                            \
133c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    uint16_array_key_value_iterator_map)                                       \
134c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT16_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                             \
135c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    int16_array_key_value_iterator_map)                                        \
136c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT32_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                            \
137c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    uint32_array_key_value_iterator_map)                                       \
138c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT32_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                             \
139c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    int32_array_key_value_iterator_map)                                        \
140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT32_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                           \
141c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    float32_array_key_value_iterator_map)                                      \
142c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT64_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                           \
143c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    float64_array_key_value_iterator_map)                                      \
144c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_CLAMPED_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                     \
145c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    uint8_clamped_array_key_value_iterator_map)                                \
146c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                                               \
147c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_SMI_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                          \
148c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_smi_array_key_value_iterator_map)                                     \
149c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_SMI_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                    \
150c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_holey_smi_array_key_value_iterator_map)                               \
151c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                              \
152c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_array_key_value_iterator_map)                                         \
153c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                        \
154c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_holey_array_key_value_iterator_map)                                   \
155c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                       \
156c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_double_array_key_value_iterator_map)                                  \
157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                 \
158c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_holey_double_array_key_value_iterator_map)                            \
159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(GENERIC_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX, Map,                           \
160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    array_key_value_iterator_map)                                              \
161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                                               \
162c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map, uint8_array_value_iterator_map) \
163c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT8_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map, int8_array_value_iterator_map)   \
164c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT16_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                                \
165c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    uint16_array_value_iterator_map)                                           \
166c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT16_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map, int16_array_value_iterator_map) \
167c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT32_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                                \
168c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    uint32_array_value_iterator_map)                                           \
169c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT32_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map, int32_array_value_iterator_map) \
170c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT32_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                               \
171c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    float32_array_value_iterator_map)                                          \
172c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT64_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                               \
173c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    float64_array_value_iterator_map)                                          \
174c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_CLAMPED_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                         \
175c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    uint8_clamped_array_value_iterator_map)                                    \
176c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                                               \
177c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_SMI_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                              \
178c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_smi_array_value_iterator_map)                                         \
179c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_SMI_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                        \
180c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_holey_smi_array_value_iterator_map)                                   \
181c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map, fast_array_value_iterator_map)   \
182c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                            \
183c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_holey_array_value_iterator_map)                                       \
184c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_DOUBLE_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                           \
185c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_double_array_value_iterator_map)                                      \
186c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map,                     \
187c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    fast_holey_double_array_value_iterator_map)                                \
188c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(GENERIC_ARRAY_VALUE_ITERATOR_MAP_INDEX, Map, array_value_iterator_map)
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NATIVE_CONTEXT_FIELDS(V)                                               \
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(GLOBAL_PROXY_INDEX, JSObject, global_proxy_object)                         \
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(EMBEDDER_DATA_INDEX, FixedArray, embedder_data)                            \
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /* Below is alpha-sorted */                                                  \
194109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  V(ACCESSOR_PROPERTY_DESCRIPTOR_MAP_INDEX, Map,                               \
195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    accessor_property_descriptor_map)                                          \
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(ALLOW_CODE_GEN_FROM_STRINGS_INDEX, Object, allow_code_gen_from_strings)    \
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(ARRAY_BUFFER_FUN_INDEX, JSFunction, array_buffer_fun)                      \
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(ARRAY_BUFFER_MAP_INDEX, Map, array_buffer_map)                             \
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ARRAY_FUNCTION_INDEX, JSFunction, array_function)                          \
20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FROM_SYNC_ITERATOR_MAP_INDEX, Map, async_from_sync_iterator_map)     \
20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FUNCTION_AWAIT_REJECT_SHARED_FUN, SharedFunctionInfo,                \
20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    async_function_await_reject_shared_fun)                                    \
20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FUNCTION_AWAIT_RESOLVE_SHARED_FUN, SharedFunctionInfo,               \
20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    async_function_await_resolve_shared_fun)                                   \
205bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(ASYNC_FUNCTION_FUNCTION_INDEX, JSFunction, async_function_constructor)     \
20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_ITERATOR_VALUE_UNWRAP_SHARED_FUN, SharedFunctionInfo,                \
20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    async_iterator_value_unwrap_shared_fun)                                    \
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(BOOLEAN_FUNCTION_INDEX, JSFunction, boolean_function)                      \
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(BOUND_FUNCTION_WITH_CONSTRUCTOR_MAP_INDEX, Map,                            \
210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bound_function_with_constructor_map)                                       \
211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(BOUND_FUNCTION_WITHOUT_CONSTRUCTOR_MAP_INDEX, Map,                         \
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bound_function_without_constructor_map)                                    \
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, JSFunction,                            \
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    call_as_constructor_delegate)                                              \
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(CALL_AS_FUNCTION_DELEGATE_INDEX, JSFunction, call_as_function_delegate)    \
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(CALLSITE_FUNCTION_INDEX, JSFunction, callsite_function)                    \
217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(CONTEXT_EXTENSION_FUNCTION_INDEX, JSFunction, context_extension_function)  \
21862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(CURRENT_MODULE_INDEX, Module, current_module)                              \
219109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  V(DATA_PROPERTY_DESCRIPTOR_MAP_INDEX, Map, data_property_descriptor_map)     \
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(DATA_VIEW_FUN_INDEX, JSFunction, data_view_fun)                            \
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DATE_FUNCTION_INDEX, JSFunction, date_function)                            \
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(ERROR_MESSAGE_FOR_CODE_GEN_FROM_STRINGS_INDEX, Object,                     \
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    error_message_for_code_gen_from_strings)                                   \
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(ERRORS_THROWN_INDEX, Smi, errors_thrown)                                   \
225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(EXTRAS_EXPORTS_OBJECT_INDEX, JSObject, extras_binding_object)              \
22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(EXTRAS_UTILS_OBJECT_INDEX, Object, extras_utils_object)                    \
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(FAST_ALIASED_ARGUMENTS_MAP_INDEX, Map, fast_aliased_arguments_map)         \
228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(FAST_TEMPLATE_INSTANTIATIONS_CACHE_INDEX, FixedArray,                      \
229f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    fast_template_instantiations_cache)                                        \
23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(FLOAT32_ARRAY_FUN_INDEX, JSFunction, float32_array_fun)                    \
23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(FLOAT64_ARRAY_FUN_INDEX, JSFunction, float64_array_fun)                    \
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(FUNCTION_FUNCTION_INDEX, JSFunction, function_function)                    \
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(GENERATOR_FUNCTION_FUNCTION_INDEX, JSFunction,                             \
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function)                                               \
235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(GENERATOR_OBJECT_PROTOTYPE_MAP_INDEX, Map, generator_object_prototype_map) \
236c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INITIAL_ARRAY_ITERATOR_PROTOTYPE_INDEX, JSObject,                          \
237c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    initial_array_iterator_prototype)                                          \
238c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INITIAL_ARRAY_ITERATOR_PROTOTYPE_MAP_INDEX, Map,                           \
239c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    initial_array_iterator_prototype_map)                                      \
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(INITIAL_ARRAY_PROTOTYPE_INDEX, JSObject, initial_array_prototype)          \
241bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(INITIAL_GENERATOR_PROTOTYPE_INDEX, JSObject, initial_generator_prototype)  \
242f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V(INITIAL_ITERATOR_PROTOTYPE_INDEX, JSObject, initial_iterator_prototype)    \
243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(INITIAL_OBJECT_PROTOTYPE_INDEX, JSObject, initial_object_prototype)        \
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(INT16_ARRAY_FUN_INDEX, JSFunction, int16_array_fun)                        \
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(INT32_ARRAY_FUN_INDEX, JSFunction, int32_array_fun)                        \
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(INT8_ARRAY_FUN_INDEX, JSFunction, int8_array_fun)                          \
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(INTERNAL_ARRAY_FUNCTION_INDEX, JSFunction, internal_array_function)        \
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(ITERATOR_RESULT_MAP_INDEX, Map, iterator_result_map)                       \
24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(INTL_DATE_TIME_FORMAT_FUNCTION_INDEX, JSFunction,                          \
25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    intl_date_time_format_function)                                            \
25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(INTL_NUMBER_FORMAT_FUNCTION_INDEX, JSFunction,                             \
25262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    intl_number_format_function)                                               \
25362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(INTL_COLLATOR_FUNCTION_INDEX, JSFunction, intl_collator_function)          \
25462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(INTL_V8_BREAK_ITERATOR_FUNCTION_INDEX, JSFunction,                         \
25562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    intl_v8_break_iterator_function)                                           \
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_ARRAY_FAST_SMI_ELEMENTS_MAP_INDEX, Map,                                 \
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    js_array_fast_smi_elements_map_index)                                      \
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_ARRAY_FAST_HOLEY_SMI_ELEMENTS_MAP_INDEX, Map,                           \
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    js_array_fast_holey_smi_elements_map_index)                                \
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, Map, js_array_fast_elements_map_index)   \
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_ARRAY_FAST_HOLEY_ELEMENTS_MAP_INDEX, Map,                               \
262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    js_array_fast_holey_elements_map_index)                                    \
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_ARRAY_FAST_DOUBLE_ELEMENTS_MAP_INDEX, Map,                              \
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    js_array_fast_double_elements_map_index)                                   \
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_ARRAY_FAST_HOLEY_DOUBLE_ELEMENTS_MAP_INDEX, Map,                        \
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    js_array_fast_holey_double_elements_map_index)                             \
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_MAP_FUN_INDEX, JSFunction, js_map_fun)                                  \
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_MAP_MAP_INDEX, Map, js_map_map)                                         \
269c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(JS_MODULE_NAMESPACE_MAP, Map, js_module_namespace_map)                     \
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_SET_FUN_INDEX, JSFunction, js_set_fun)                                  \
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_SET_MAP_INDEX, Map, js_set_map)                                         \
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_WEAK_MAP_FUN_INDEX, JSFunction, js_weak_map_fun)                        \
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(JS_WEAK_SET_FUN_INDEX, JSFunction, js_weak_set_fun)                        \
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(MAP_CACHE_INDEX, Object, map_cache)                                        \
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(MAP_ITERATOR_MAP_INDEX, Map, map_iterator_map)                             \
276c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(MATH_RANDOM_INDEX_INDEX, Smi, math_random_index)                           \
277c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(MATH_RANDOM_CACHE_INDEX, Object, math_random_cache)                        \
278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(MESSAGE_LISTENERS_INDEX, TemplateList, message_listeners)                  \
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(NATIVES_UTILS_OBJECT_INDEX, Object, natives_utils_object)                  \
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(NORMALIZED_MAP_CACHE_INDEX, Object, normalized_map_cache)                  \
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(NUMBER_FUNCTION_INDEX, JSFunction, number_function)                        \
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(OBJECT_FUNCTION_INDEX, JSFunction, object_function)                        \
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(OBJECT_FUNCTION_PROTOTYPE_MAP_INDEX, Map, object_function_prototype_map)   \
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(OPAQUE_REFERENCE_FUNCTION_INDEX, JSFunction, opaque_reference_function)    \
28562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(OSR_CODE_TABLE_INDEX, FixedArray, osr_code_table)                          \
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(PROXY_CALLABLE_MAP_INDEX, Map, proxy_callable_map)                         \
287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(PROXY_CONSTRUCTOR_MAP_INDEX, Map, proxy_constructor_map)                   \
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(PROXY_FUNCTION_INDEX, JSFunction, proxy_function)                          \
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(PROXY_FUNCTION_MAP_INDEX, Map, proxy_function_map)                         \
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(PROXY_MAP_INDEX, Map, proxy_map)                                           \
29162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_GET_CAPABILITIES_EXECUTOR_SHARED_FUN, SharedFunctionInfo,          \
29262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    promise_get_capabilities_executor_shared_fun)                              \
293c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(PROMISE_RESOLVE_SHARED_FUN, SharedFunctionInfo,                            \
294c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    promise_resolve_shared_fun)                                                \
295c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(PROMISE_REJECT_SHARED_FUN, SharedFunctionInfo, promise_reject_shared_fun)  \
29662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_THEN_FINALLY_SHARED_FUN, SharedFunctionInfo,                       \
29762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    promise_then_finally_shared_fun)                                           \
29862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_CATCH_FINALLY_SHARED_FUN, SharedFunctionInfo,                      \
29962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    promise_catch_finally_shared_fun)                                          \
30062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_VALUE_THUNK_FINALLY_SHARED_FUN, SharedFunctionInfo,                \
30162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    promise_value_thunk_finally_shared_fun)                                    \
30262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_THROWER_FINALLY_SHARED_FUN, SharedFunctionInfo,                    \
30362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    promise_thrower_finally_shared_fun)                                        \
30462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(PROMISE_PROTOTYPE_MAP_INDEX, Map, promise_prototype_map)                   \
305c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(REGEXP_EXEC_FUNCTION_INDEX, JSFunction, regexp_exec_function)              \
306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(REGEXP_FUNCTION_INDEX, JSFunction, regexp_function)                        \
307c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(REGEXP_LAST_MATCH_INFO_INDEX, RegExpMatchInfo, regexp_last_match_info)     \
308c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(REGEXP_INTERNAL_MATCH_INFO_INDEX, RegExpMatchInfo,                         \
309c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    regexp_internal_match_info)                                                \
310c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(REGEXP_PROTOTYPE_MAP_INDEX, Map, regexp_prototype_map)                     \
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(REGEXP_RESULT_MAP_INDEX, Map, regexp_result_map)                           \
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SCRIPT_CONTEXT_TABLE_INDEX, ScriptContextTable, script_context_table)      \
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SCRIPT_FUNCTION_INDEX, JSFunction, script_function)                        \
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SECURITY_TOKEN_INDEX, Object, security_token)                              \
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SELF_WEAK_CELL_INDEX, WeakCell, self_weak_cell)                            \
316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SET_ITERATOR_MAP_INDEX, Map, set_iterator_map)                             \
317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SHARED_ARRAY_BUFFER_FUN_INDEX, JSFunction, shared_array_buffer_fun)        \
318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SLOPPY_ARGUMENTS_MAP_INDEX, Map, sloppy_arguments_map)                     \
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SLOPPY_FUNCTION_MAP_INDEX, Map, sloppy_function_map)                       \
320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SLOPPY_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map,                          \
321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    sloppy_function_without_prototype_map)                                     \
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SLOPPY_FUNCTION_WITH_READONLY_PROTOTYPE_MAP_INDEX, Map,                    \
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    sloppy_function_with_readonly_prototype_map)                               \
324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SLOW_ALIASED_ARGUMENTS_MAP_INDEX, Map, slow_aliased_arguments_map)         \
32562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP, Map,                                  \
32662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    slow_object_with_null_prototype_map)                                       \
32762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(SLOW_TEMPLATE_INSTANTIATIONS_CACHE_INDEX, UnseededNumberDictionary,        \
32862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    slow_template_instantiations_cache)                                        \
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(STRICT_ARGUMENTS_MAP_INDEX, Map, strict_arguments_map)                     \
33062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ASYNC_FUNCTION_MAP_INDEX, Map, async_function_map)                         \
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(STRICT_FUNCTION_MAP_INDEX, Map, strict_function_map)                       \
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map,                          \
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    strict_function_without_prototype_map)                                     \
33462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(GENERATOR_FUNCTION_MAP_INDEX, Map, generator_function_map)                 \
33562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(CLASS_FUNCTION_MAP_INDEX, Map, class_function_map)                         \
336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(STRING_FUNCTION_INDEX, JSFunction, string_function)                        \
337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(STRING_FUNCTION_PROTOTYPE_MAP_INDEX, Map, string_function_prototype_map)   \
33862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(STRING_ITERATOR_MAP_INDEX, Map, string_iterator_map)                       \
339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(SYMBOL_FUNCTION_INDEX, JSFunction, symbol_function)                        \
34062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(NATIVE_FUNCTION_MAP_INDEX, Map, native_function_map)                       \
34162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_FUNCTION_MAP_INDEX, Map, wasm_function_map)                           \
34262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_INSTANCE_CONSTRUCTOR_INDEX, JSFunction, wasm_instance_constructor)    \
34362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_INSTANCE_SYM_INDEX, Symbol, wasm_instance_sym)                        \
34462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_MEMORY_CONSTRUCTOR_INDEX, JSFunction, wasm_memory_constructor)        \
34562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_MEMORY_SYM_INDEX, Symbol, wasm_memory_sym)                            \
34662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_MODULE_CONSTRUCTOR_INDEX, JSFunction, wasm_module_constructor)        \
34762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_MODULE_SYM_INDEX, Symbol, wasm_module_sym)                            \
34862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_TABLE_CONSTRUCTOR_INDEX, JSFunction, wasm_table_constructor)          \
34962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(WASM_TABLE_SYM_INDEX, Symbol, wasm_table_sym)                              \
35013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(TYPED_ARRAY_FUN_INDEX, JSFunction, typed_array_function)                   \
35113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(TYPED_ARRAY_PROTOTYPE_INDEX, JSObject, typed_array_prototype)              \
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(UINT16_ARRAY_FUN_INDEX, JSFunction, uint16_array_fun)                      \
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(UINT32_ARRAY_FUN_INDEX, JSFunction, uint32_array_fun)                      \
354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(UINT8_ARRAY_FUN_INDEX, JSFunction, uint8_array_fun)                        \
355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(UINT8_CLAMPED_ARRAY_FUN_INDEX, JSFunction, uint8_clamped_array_fun)        \
35662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(EXPORTS_CONTAINER, Object, exports_container)                              \
357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  NATIVE_CONTEXT_INTRINSIC_FUNCTIONS(V)                                        \
358c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  NATIVE_CONTEXT_IMPORTED_FIELDS(V)                                            \
359c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  NATIVE_CONTEXT_JS_ARRAY_ITERATOR_MAPS(V)
360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// A table of all script contexts. Every loaded top-level script with top-level
362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// lexical declarations contributes its ScriptContext into this table.
363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//
364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The table is a fixed array, its first slot is the current used count and
365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// the subsequent slots 1..used contain ScriptContexts.
366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass ScriptContextTable : public FixedArray {
367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Conversions.
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static inline ScriptContextTable* cast(Object* context);
370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  struct LookupResult {
372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int context_index;
373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int slot_index;
374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    VariableMode mode;
375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    InitializationFlag init_flag;
376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MaybeAssignedFlag maybe_assigned_flag;
377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline int used() const;
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_used(int used);
381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static inline Handle<Context> GetContext(Handle<ScriptContextTable> table,
383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           int i);
384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Lookup a variable `name` in a ScriptContextTable.
386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // If it returns true, the variable is found and `result` contains
387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // valid information about its location.
388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // If it returns false, `result` is untouched.
389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT
390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static bool Lookup(Handle<ScriptContextTable> table, Handle<String> name,
391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                     LookupResult* result);
392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT
394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static Handle<ScriptContextTable> Extend(Handle<ScriptContextTable> table,
395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                           Handle<Context> script_context);
396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static int GetContextOffset(int context_index) {
398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return kFirstContextOffset + context_index * kPointerSize;
399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kUsedSlot = 0;
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kFirstContextSlot = kUsedSlot + 1;
404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kFirstContextOffset =
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FixedArray::kHeaderSize + kFirstContextSlot * kPointerSize;
406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DISALLOW_IMPLICIT_CONSTRUCTORS(ScriptContextTable);
408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// JSFunctions are pairs (context, function code), sometimes also called
411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// closures. A Context object is used to represent function contexts and
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// dynamically pushed 'with' contexts (or 'scopes' in ECMA-262 speak).
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// At runtime, the contexts build a stack in parallel to the execution
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// stack, with the top-most context being the current context. All contexts
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// have the following slots:
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// [ closure   ]  This is the current function. It is the same for all
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//                contexts inside a function. It provides access to the
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//                incoming context (i.e., the outer context, which may
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//                or may not become the current function's context), and
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//                it provides access to the functions code and thus it's
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//                scope information, which in turn contains the names of
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//                statically allocated context slots. The names are needed
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//                for dynamic lookups in the presence of 'with' or 'eval'.
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// [ previous  ]  A pointer to the previous context.
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
429f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// [ extension ]  Additional data.
430f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//
431f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                For script contexts, it contains the respective ScopeInfo.
432f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//
433f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                For catch contexts, it contains a ContextExtension object
434f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                consisting of the ScopeInfo and the name of the catch
435f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                variable.
436f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//
437f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                For module contexts, it contains the module object.
438f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//
439f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                For block contexts, it contains either the respective
440f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                ScopeInfo or a ContextExtension object consisting of the
441f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                ScopeInfo and an "extension object" (see below).
442f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//
443f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                For with contexts, it contains a ContextExtension object
444f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                consisting of the ScopeInfo and an "extension object".
445f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//
446f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                An "extension object" is used to dynamically extend a context
447f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                with additional variables, namely in the implementation of the
448f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                'with' construct and the 'eval' construct.  For instance,
449f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                Context::Lookup also searches the extension object for
450f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                properties.  (Storing the extension object is the original
451f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch//                purpose of this context slot, hence the name.)
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
453f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// [ native_context ]  A pointer to the native context.
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// In addition, function contexts may have statically allocated context slots
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to store local variables/functions that are accessed from inner functions
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (via static context addresses) or through 'eval' (dynamic context lookups).
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The native context contains additional slots for fast access to native
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// properties.
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Finally, with Harmony scoping, the JSFunction representing a top level
462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// script will have the ScriptContext rather than a FunctionContext.
463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Script contexts from all top-level scripts are gathered in
464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// ScriptContextTable.
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Context: public FixedArray {
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Conversions.
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static inline Context* cast(Object* context);
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The default context slot layout; indices are FixedArray slot indices.
472c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  enum Field {
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // These slots are in all contexts.
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CLOSURE_INDEX,
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PREVIOUS_INDEX,
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // The extension slot is used for either the global object (in native
4773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // contexts), eval extension object (function contexts), subject of with
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // (with contexts), or the variable name (catch contexts), the serialized
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // scope info (block contexts), or the module instance (module contexts).
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EXTENSION_INDEX,
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    NATIVE_CONTEXT_INDEX,
4823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // These slots are only in native contexts.
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define NATIVE_CONTEXT_SLOT(index, type, name) index,
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_SLOT)
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef NATIVE_CONTEXT_SLOT
487f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
488f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    // Properties from here are treated as weak references by the full GC.
489f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    // Scavenge treats them as strong references.
490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    OPTIMIZED_FUNCTIONS_LIST,  // Weak.
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    OPTIMIZED_CODE_LIST,       // Weak.
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DEOPTIMIZED_CODE_LIST,     // Weak.
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    NEXT_CONTEXT_LINK,         // Weak.
494f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
495f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    // Total number of slots.
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    NATIVE_CONTEXT_SLOTS,
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FIRST_WEAK_SLOT = OPTIMIZED_FUNCTIONS_LIST,
498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FIRST_JS_ARRAY_MAP_SLOT = JS_ARRAY_FAST_SMI_ELEMENTS_MAP_INDEX,
499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MIN_CONTEXT_SLOTS = GLOBAL_PROXY_INDEX,
501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // This slot holds the thrown value in catch contexts.
502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    THROWN_OBJECT_INDEX = MIN_CONTEXT_SLOTS,
5033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
5043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // These slots hold values in debug evaluate contexts.
5053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    WRAPPED_CONTEXT_INDEX = MIN_CONTEXT_SLOTS,
5063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    WHITE_LIST_INDEX = MIN_CONTEXT_SLOTS + 1
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void ResetErrorsThrown();
510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void IncrementErrorsThrown();
511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int GetErrorsThrown();
512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Direct slot access.
514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline JSFunction* closure();
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_closure(JSFunction* closure);
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Context* previous();
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_previous(Context* context);
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
520bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  inline Object* next_context_link();
521bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool has_extension();
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline HeapObject* extension();
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_extension(HeapObject* object);
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject* extension_object();
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSReceiver* extension_receiver();
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ScopeInfo* scope_info();
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  String* catch_name();
5293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
530f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Find the module context (assuming there is one) and return the associated
531f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // module object.
532f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Module* module();
533f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
5343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Get the context where var declarations will be hoisted to, which
5353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // may be the context itself.
5363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Context* declaration_context();
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool is_declaration_context();
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
539109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Get the next closure's context on the context chain.
540109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Context* closure_context();
541109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Returns a JSGlobalProxy object or null.
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObject* global_proxy();
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void set_global_proxy(JSObject* global);
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Get the JSGlobalObject object.
547f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V8_EXPORT_PRIVATE JSGlobalObject* global_object();
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Get the script context by traversing the context chain.
550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Context* script_context();
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Compute the native context.
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Context* native_context();
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_native_context(Context* context);
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Predicates for context types.  IsNativeContext is also defined on Object
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // because we frequently have to know if arbitrary objects are natives
5583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // contexts.
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsNativeContext();
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsFunctionContext();
561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsCatchContext();
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsWithContext();
5633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  inline bool IsDebugEvaluateContext();
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsBlockContext();
565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsModuleContext();
56662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  inline bool IsEvalContext();
567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsScriptContext();
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool HasSameSecurityTokenAs(Context* that);
570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
57162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Removes a specific optimized code object from the optimized code map.
57262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // In case of non-OSR the code reference is cleared from the cache entry but
57362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // the entry itself is left in the map in order to proceed sharing literals.
57462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void EvictFromOptimizedCodeMap(Code* optimized_code, const char* reason);
57562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
57662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Clear optimized code map.
57762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void ClearOptimizedCodeMap();
57862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
57962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // A native context keeps track of all osrd optimized functions.
58062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  inline bool OptimizedCodeMapIsCleared();
58162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Code* SearchOptimizedCodeMap(SharedFunctionInfo* shared,
58262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                               BailoutId osr_ast_id);
58362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int SearchOptimizedCodeMapEntry(SharedFunctionInfo* shared,
58462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                  BailoutId osr_ast_id);
58562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
58662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static void AddToOptimizedCodeMap(Handle<Context> native_context,
58762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                    Handle<SharedFunctionInfo> shared,
58862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                    Handle<Code> code,
58962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                    BailoutId osr_ast_id);
59062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A native context holds a list of all functions with optimized code.
592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddOptimizedFunction(JSFunction* function);
593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RemoveOptimizedFunction(JSFunction* function);
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetOptimizedFunctionsListHead(Object* head);
595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Object* OptimizedFunctionsListHead();
5963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The native context also stores a list of all optimized code and a
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // list of all deoptimized code, which are needed by the deoptimizer.
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddOptimizedCode(Code* code);
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetOptimizedCodeListHead(Object* head);
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* OptimizedCodeListHead();
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetDeoptimizedCodeListHead(Object* head);
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* DeoptimizedCodeListHead();
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> ErrorMessageForCodeGenerationFromStrings();
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static int ImportedFieldIndexForName(Handle<String> name);
608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static int IntrinsicIndexForName(Handle<String> name);
609f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static int IntrinsicIndexForName(const unsigned char* name, int length);
610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NATIVE_CONTEXT_FIELD_ACCESSORS(index, type, name) \
612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_##name(type* value);                    \
613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool is_##name(type* value);                     \
614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline type* name();
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSORS)
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NATIVE_CONTEXT_FIELD_ACCESSORS
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Lookup the slot called name, starting with the current context.
6193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // There are three possibilities:
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //
6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // 1) result->IsContext():
6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    The binding was found in a context.  *index is always the
6233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    non-negative slot index.  *attributes is NONE for var and let
6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    declarations, READ_ONLY for const declarations (never ABSENT).
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //
6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // 2) result->IsJSObject():
6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    The binding was found as a named property in a context extension
6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    object (i.e., was introduced via eval), as a property on the subject
6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    of with, or as a property of the global object.  *index is -1 and
6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    *attributes is not ABSENT.
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //
6323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // 3) result.is_null():
6333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    There was no binding found, *index is always -1 and *attributes is
6343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //    always ABSENT.
635f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Object> Lookup(Handle<String> name, ContextLookupFlags flags,
636f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        int* index, PropertyAttributes* attributes,
637f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        InitializationFlag* init_flag,
638f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        VariableMode* variable_mode);
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Code generation support.
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int SlotOffset(int index) {
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return kHeaderSize + index * kPointerSize - kHeapObjectTag;
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static int FunctionMapIndex(LanguageMode language_mode, FunctionKind kind) {
64662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Note: Must be kept in sync with the FastNewClosure builtin.
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsGeneratorFunction(kind)) {
64862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return GENERATOR_FUNCTION_MAP_INDEX;
649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
651bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (IsAsyncFunction(kind)) {
65262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return ASYNC_FUNCTION_MAP_INDEX;
653bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
654bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (IsClassConstructor(kind)) {
65662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // Like the strict function map, but with no 'name' accessor. 'name'
65762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // needs to be the last property and it is added during instantiation,
65862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // in case a static property with the same name exists"
65962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return CLASS_FUNCTION_MAP_INDEX;
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (IsArrowFunction(kind) || IsConciseMethod(kind) ||
663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        IsAccessorFunction(kind)) {
6643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX;
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return is_strict(language_mode) ? STRICT_FUNCTION_MAP_INDEX
668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    : SLOPPY_FUNCTION_MAP_INDEX;
669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static int ArrayMapIndex(ElementsKind elements_kind) {
672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(IsFastElementsKind(elements_kind));
6733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return elements_kind + FIRST_JS_ARRAY_MAP_SLOT;
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kSize = kHeaderSize + NATIVE_CONTEXT_SLOTS * kPointerSize;
677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kNotFound = -1;
678f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
679f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // GC support.
680f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  typedef FixedBodyDescriptor<
681f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch      kHeaderSize, kSize, kSize> ScavengeBodyDescriptor;
682f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
683f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  typedef FixedBodyDescriptor<
684f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch      kHeaderSize,
685f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch      kHeaderSize + FIRST_WEAK_SLOT * kPointerSize,
686f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch      kSize> MarkCompactBodyDescriptor;
687f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Bootstrapping-aware type checks.
691f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V8_EXPORT_PRIVATE static bool IsBootstrappingOrNativeContext(Isolate* isolate,
692f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                                               Object* object);
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool IsBootstrappingOrValidParentContext(Object* object, Context* kid);
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kHeaderSize == Internals::kContextHeaderSize);
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(EMBEDDER_DATA_INDEX == Internals::kContextEmbedderDataIndex);
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
700c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochtypedef Context::Field ContextField;
701c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_CONTEXTS_H_
706