xref: /third_party/node/deps/v8/src/objects/contexts.h (revision 1cb0ef41)
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_CONTEXTS_H_
6#define V8_OBJECTS_CONTEXTS_H_
7
8#include "include/v8-promise.h"
9#include "src/objects/fixed-array.h"
10#include "src/objects/function-kind.h"
11#include "src/objects/ordered-hash-table.h"
12#include "src/objects/osr-optimized-code-cache.h"
13// Has to be the last include (doesn't have include guards):
14#include "src/objects/object-macros.h"
15
16namespace v8 {
17namespace internal {
18
19class JSGlobalObject;
20class JSGlobalProxy;
21class MicrotaskQueue;
22class NativeContext;
23class RegExpMatchInfo;
24
25enum ContextLookupFlags {
26  FOLLOW_CONTEXT_CHAIN = 1 << 0,
27  FOLLOW_PROTOTYPE_CHAIN = 1 << 1,
28
29  DONT_FOLLOW_CHAINS = 0,
30  FOLLOW_CHAINS = FOLLOW_CONTEXT_CHAIN | FOLLOW_PROTOTYPE_CHAIN,
31};
32
33// Heap-allocated activation contexts.
34//
35// Contexts are implemented as FixedArray-like objects having a fixed
36// header with a set of common fields.
37//
38// Note: Context must have no virtual functions and Context objects
39// must always be allocated via Heap::AllocateContext() or
40// Factory::NewContext.
41
42#define NATIVE_CONTEXT_INTRINSIC_FUNCTIONS(V)                     \
43  V(GENERATOR_NEXT_INTERNAL, JSFunction, generator_next_internal) \
44  V(ASYNC_MODULE_EVALUATE_INTERNAL, JSFunction,                   \
45    async_module_evaluate_internal)                               \
46  V(REFLECT_APPLY_INDEX, JSFunction, reflect_apply)               \
47  V(REFLECT_CONSTRUCT_INDEX, JSFunction, reflect_construct)       \
48  V(PROMISE_THEN_INDEX, JSFunction, promise_then)                 \
49  V(FUNCTION_PROTOTYPE_APPLY_INDEX, JSFunction, function_prototype_apply)
50
51#define NATIVE_CONTEXT_FIELDS(V)                                               \
52  V(GLOBAL_PROXY_INDEX, JSGlobalProxy, global_proxy_object)                    \
53  /* TODO(ishell): Actually we store exactly EmbedderDataArray here but */     \
54  /* it's already UBSan-fiendly and doesn't require a star... So declare */    \
55  /* it as a HeapObject for now. */                                            \
56  V(EMBEDDER_DATA_INDEX, HeapObject, embedder_data)                            \
57  V(CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX, HeapObject,                    \
58    continuation_preserved_embedder_data)                                      \
59  NATIVE_CONTEXT_INTRINSIC_FUNCTIONS(V)                                        \
60  /* TypedArray constructors - these must stay in order! */                    \
61  V(UINT8_ARRAY_FUN_INDEX, JSFunction, uint8_array_fun)                        \
62  V(INT8_ARRAY_FUN_INDEX, JSFunction, int8_array_fun)                          \
63  V(UINT16_ARRAY_FUN_INDEX, JSFunction, uint16_array_fun)                      \
64  V(INT16_ARRAY_FUN_INDEX, JSFunction, int16_array_fun)                        \
65  V(UINT32_ARRAY_FUN_INDEX, JSFunction, uint32_array_fun)                      \
66  V(INT32_ARRAY_FUN_INDEX, JSFunction, int32_array_fun)                        \
67  V(FLOAT32_ARRAY_FUN_INDEX, JSFunction, float32_array_fun)                    \
68  V(FLOAT64_ARRAY_FUN_INDEX, JSFunction, float64_array_fun)                    \
69  V(UINT8_CLAMPED_ARRAY_FUN_INDEX, JSFunction, uint8_clamped_array_fun)        \
70  V(BIGUINT64_ARRAY_FUN_INDEX, JSFunction, biguint64_array_fun)                \
71  V(BIGINT64_ARRAY_FUN_INDEX, JSFunction, bigint64_array_fun)                  \
72  V(RAB_GSAB_UINT8_ARRAY_MAP_INDEX, Map, rab_gsab_uint8_array_map)             \
73  V(RAB_GSAB_INT8_ARRAY_MAP_INDEX, Map, rab_gsab_int8_array_map)               \
74  V(RAB_GSAB_UINT16_ARRAY_MAP_INDEX, Map, rab_gsab_uint16_array_map)           \
75  V(RAB_GSAB_INT16_ARRAY_MAP_INDEX, Map, rab_gsab_int16_array_map)             \
76  V(RAB_GSAB_UINT32_ARRAY_MAP_INDEX, Map, rab_gsab_uint32_array_map)           \
77  V(RAB_GSAB_INT32_ARRAY_MAP_INDEX, Map, rab_gsab_int32_array_map)             \
78  V(RAB_GSAB_FLOAT32_ARRAY_MAP_INDEX, Map, rab_gsab_float32_array_map)         \
79  V(RAB_GSAB_FLOAT64_ARRAY_MAP_INDEX, Map, rab_gsab_float64_array_map)         \
80  V(RAB_GSAB_UINT8_CLAMPED_ARRAY_MAP_INDEX, Map,                               \
81    rab_gsab_uint8_clamped_array_map)                                          \
82  V(RAB_GSAB_BIGUINT64_ARRAY_MAP_INDEX, Map, rab_gsab_biguint64_array_map)     \
83  V(RAB_GSAB_BIGINT64_ARRAY_MAP_INDEX, Map, rab_gsab_bigint64_array_map)       \
84  /* Below is alpha-sorted */                                                  \
85  V(ACCESSOR_PROPERTY_DESCRIPTOR_MAP_INDEX, Map,                               \
86    accessor_property_descriptor_map)                                          \
87  V(ALLOW_CODE_GEN_FROM_STRINGS_INDEX, Object, allow_code_gen_from_strings)    \
88  V(ARRAY_BUFFER_FUN_INDEX, JSFunction, array_buffer_fun)                      \
89  V(ARRAY_BUFFER_MAP_INDEX, Map, array_buffer_map)                             \
90  V(ARRAY_BUFFER_NOINIT_FUN_INDEX, JSFunction, array_buffer_noinit_fun)        \
91  V(ARRAY_FUNCTION_INDEX, JSFunction, array_function)                          \
92  V(ARRAY_JOIN_STACK_INDEX, HeapObject, array_join_stack)                      \
93  V(ASYNC_FROM_SYNC_ITERATOR_MAP_INDEX, Map, async_from_sync_iterator_map)     \
94  V(ASYNC_FUNCTION_FUNCTION_INDEX, JSFunction, async_function_constructor)     \
95  V(ASYNC_FUNCTION_OBJECT_MAP_INDEX, Map, async_function_object_map)           \
96  V(ASYNC_GENERATOR_FUNCTION_FUNCTION_INDEX, JSFunction,                       \
97    async_generator_function_function)                                         \
98  V(ATOMICS_OBJECT, JSObject, atomics_object)                                  \
99  V(BIGINT_FUNCTION_INDEX, JSFunction, bigint_function)                        \
100  V(BOOLEAN_FUNCTION_INDEX, JSFunction, boolean_function)                      \
101  V(BOUND_FUNCTION_WITH_CONSTRUCTOR_MAP_INDEX, Map,                            \
102    bound_function_with_constructor_map)                                       \
103  V(BOUND_FUNCTION_WITHOUT_CONSTRUCTOR_MAP_INDEX, Map,                         \
104    bound_function_without_constructor_map)                                    \
105  V(CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, JSFunction,                            \
106    call_as_constructor_delegate)                                              \
107  V(CALL_AS_FUNCTION_DELEGATE_INDEX, JSFunction, call_as_function_delegate)    \
108  V(CALL_ASYNC_MODULE_FULFILLED, JSFunction, call_async_module_fulfilled)      \
109  V(CALL_ASYNC_MODULE_REJECTED, JSFunction, call_async_module_rejected)        \
110  V(CALLSITE_FUNCTION_INDEX, JSFunction, callsite_function)                    \
111  V(CONTEXT_EXTENSION_FUNCTION_INDEX, JSFunction, context_extension_function)  \
112  V(DATA_PROPERTY_DESCRIPTOR_MAP_INDEX, Map, data_property_descriptor_map)     \
113  V(DATA_VIEW_FUN_INDEX, JSFunction, data_view_fun)                            \
114  V(DATE_FUNCTION_INDEX, JSFunction, date_function)                            \
115  V(DEBUG_CONTEXT_ID_INDEX, Object, debug_context_id)                          \
116  V(EMPTY_FUNCTION_INDEX, JSFunction, empty_function)                          \
117  V(ERROR_MESSAGE_FOR_CODE_GEN_FROM_STRINGS_INDEX, Object,                     \
118    error_message_for_code_gen_from_strings)                                   \
119  V(ERRORS_THROWN_INDEX, Smi, errors_thrown)                                   \
120  V(EXTRAS_BINDING_OBJECT_INDEX, JSObject, extras_binding_object)              \
121  V(FAST_ALIASED_ARGUMENTS_MAP_INDEX, Map, fast_aliased_arguments_map)         \
122  V(FAST_TEMPLATE_INSTANTIATIONS_CACHE_INDEX, FixedArray,                      \
123    fast_template_instantiations_cache)                                        \
124  V(FUNCTION_FUNCTION_INDEX, JSFunction, function_function)                    \
125  V(FUNCTION_PROTOTYPE_INDEX, JSObject, function_prototype)                    \
126  V(GENERATOR_FUNCTION_FUNCTION_INDEX, JSFunction,                             \
127    generator_function_function)                                               \
128  V(GENERATOR_OBJECT_PROTOTYPE_MAP_INDEX, Map, generator_object_prototype_map) \
129  V(ASYNC_GENERATOR_OBJECT_PROTOTYPE_MAP_INDEX, Map,                           \
130    async_generator_object_prototype_map)                                      \
131  V(INITIAL_ARRAY_ITERATOR_MAP_INDEX, Map, initial_array_iterator_map)         \
132  V(INITIAL_ARRAY_ITERATOR_PROTOTYPE_INDEX, JSObject,                          \
133    initial_array_iterator_prototype)                                          \
134  V(INITIAL_ARRAY_PROTOTYPE_INDEX, JSObject, initial_array_prototype)          \
135  V(INITIAL_ERROR_PROTOTYPE_INDEX, JSObject, initial_error_prototype)          \
136  V(INITIAL_GENERATOR_PROTOTYPE_INDEX, JSObject, initial_generator_prototype)  \
137  V(INITIAL_ASYNC_ITERATOR_PROTOTYPE_INDEX, JSObject,                          \
138    initial_async_iterator_prototype)                                          \
139  V(INITIAL_ASYNC_GENERATOR_PROTOTYPE_INDEX, JSObject,                         \
140    initial_async_generator_prototype)                                         \
141  V(INITIAL_ITERATOR_PROTOTYPE_INDEX, JSObject, initial_iterator_prototype)    \
142  V(INITIAL_MAP_ITERATOR_PROTOTYPE_INDEX, JSObject,                            \
143    initial_map_iterator_prototype)                                            \
144  V(INITIAL_MAP_PROTOTYPE_MAP_INDEX, Map, initial_map_prototype_map)           \
145  V(INITIAL_OBJECT_PROTOTYPE_INDEX, JSObject, initial_object_prototype)        \
146  V(INITIAL_SET_ITERATOR_PROTOTYPE_INDEX, JSObject,                            \
147    initial_set_iterator_prototype)                                            \
148  V(INITIAL_SET_PROTOTYPE_INDEX, JSObject, initial_set_prototype)              \
149  V(INITIAL_SET_PROTOTYPE_MAP_INDEX, Map, initial_set_prototype_map)           \
150  V(INITIAL_STRING_ITERATOR_MAP_INDEX, Map, initial_string_iterator_map)       \
151  V(INITIAL_STRING_ITERATOR_PROTOTYPE_INDEX, JSObject,                         \
152    initial_string_iterator_prototype)                                         \
153  V(INITIAL_STRING_PROTOTYPE_INDEX, JSObject, initial_string_prototype)        \
154  V(INITIAL_WEAKMAP_PROTOTYPE_MAP_INDEX, Map, initial_weakmap_prototype_map)   \
155  V(INITIAL_WEAKSET_PROTOTYPE_MAP_INDEX, Map, initial_weakset_prototype_map)   \
156  V(INTL_COLLATOR_FUNCTION_INDEX, JSFunction, intl_collator_function)          \
157  V(INTL_DATE_TIME_FORMAT_FUNCTION_INDEX, JSFunction,                          \
158    intl_date_time_format_function)                                            \
159  V(INTL_DISPLAY_NAMES_FUNCTION_INDEX, JSFunction,                             \
160    intl_display_names_function)                                               \
161  V(INTL_NUMBER_FORMAT_FUNCTION_INDEX, JSFunction,                             \
162    intl_number_format_function)                                               \
163  V(INTL_LOCALE_FUNCTION_INDEX, JSFunction, intl_locale_function)              \
164  V(INTL_LIST_FORMAT_FUNCTION_INDEX, JSFunction, intl_list_format_function)    \
165  V(INTL_PLURAL_RULES_FUNCTION_INDEX, JSFunction, intl_plural_rules_function)  \
166  V(INTL_RELATIVE_TIME_FORMAT_FUNCTION_INDEX, JSFunction,                      \
167    intl_relative_time_format_function)                                        \
168  V(INTL_SEGMENTER_FUNCTION_INDEX, JSFunction, intl_segmenter_function)        \
169  V(INTL_SEGMENTS_MAP_INDEX, Map, intl_segments_map)                           \
170  V(INTL_SEGMENT_ITERATOR_MAP_INDEX, Map, intl_segment_iterator_map)           \
171  V(ITERATOR_RESULT_MAP_INDEX, Map, iterator_result_map)                       \
172  V(JS_ARRAY_PACKED_SMI_ELEMENTS_MAP_INDEX, Map,                               \
173    js_array_packed_smi_elements_map)                                          \
174  V(JS_ARRAY_HOLEY_SMI_ELEMENTS_MAP_INDEX, Map,                                \
175    js_array_holey_smi_elements_map)                                           \
176  V(JS_ARRAY_PACKED_ELEMENTS_MAP_INDEX, Map, js_array_packed_elements_map)     \
177  V(JS_ARRAY_HOLEY_ELEMENTS_MAP_INDEX, Map, js_array_holey_elements_map)       \
178  V(JS_ARRAY_PACKED_DOUBLE_ELEMENTS_MAP_INDEX, Map,                            \
179    js_array_packed_double_elements_map)                                       \
180  V(JS_ARRAY_HOLEY_DOUBLE_ELEMENTS_MAP_INDEX, Map,                             \
181    js_array_holey_double_elements_map)                                        \
182  V(JS_MAP_FUN_INDEX, JSFunction, js_map_fun)                                  \
183  V(JS_MAP_MAP_INDEX, Map, js_map_map)                                         \
184  V(JS_MODULE_NAMESPACE_MAP, Map, js_module_namespace_map)                     \
185  V(JS_SET_FUN_INDEX, JSFunction, js_set_fun)                                  \
186  V(JS_SET_MAP_INDEX, Map, js_set_map)                                         \
187  V(JS_WEAK_MAP_FUN_INDEX, JSFunction, js_weak_map_fun)                        \
188  V(JS_WEAK_SET_FUN_INDEX, JSFunction, js_weak_set_fun)                        \
189  V(JS_WEAK_REF_FUNCTION_INDEX, JSFunction, js_weak_ref_fun)                   \
190  V(JS_FINALIZATION_REGISTRY_FUNCTION_INDEX, JSFunction,                       \
191    js_finalization_registry_fun)                                              \
192  V(JS_TEMPORAL_CALENDAR_FUNCTION_INDEX, JSFunction,                           \
193    temporal_calendar_function)                                                \
194  V(JS_TEMPORAL_DURATION_FUNCTION_INDEX, JSFunction,                           \
195    temporal_duration_function)                                                \
196  V(JS_TEMPORAL_INSTANT_FUNCTION_INDEX, JSFunction, temporal_instant_function) \
197  V(JS_TEMPORAL_PLAIN_DATE_FUNCTION_INDEX, JSFunction,                         \
198    temporal_plain_date_function)                                              \
199  V(JS_TEMPORAL_PLAIN_DATE_TIME_FUNCTION_INDEX, JSFunction,                    \
200    temporal_plain_date_time_function)                                         \
201  V(JS_TEMPORAL_PLAIN_MONTH_DAY_FUNCTION_INDEX, JSFunction,                    \
202    temporal_plain_month_day_function)                                         \
203  V(JS_TEMPORAL_PLAIN_TIME_FUNCTION_INDEX, JSFunction,                         \
204    temporal_plain_time_function)                                              \
205  V(JS_TEMPORAL_PLAIN_YEAR_MONTH_FUNCTION_INDEX, JSFunction,                   \
206    temporal_plain_year_month_function)                                        \
207  V(JS_TEMPORAL_TIME_ZONE_FUNCTION_INDEX, JSFunction,                          \
208    temporal_time_zone_function)                                               \
209  V(JS_TEMPORAL_ZONED_DATE_TIME_FUNCTION_INDEX, JSFunction,                    \
210    temporal_zoned_date_time_function)                                         \
211  V(TEMPORAL_INSTANT_FIXED_ARRAY_FROM_ITERABLE_FUNCTION_INDEX, JSFunction,     \
212    temporal_instant_fixed_array_from_iterable)                                \
213  V(STRING_FIXED_ARRAY_FROM_ITERABLE_FUNCTION_INDEX, JSFunction,               \
214    string_fixed_array_from_iterable)                                          \
215  /* Context maps */                                                           \
216  V(NATIVE_CONTEXT_MAP_INDEX, Map, native_context_map)                         \
217  V(FUNCTION_CONTEXT_MAP_INDEX, Map, function_context_map)                     \
218  V(MODULE_CONTEXT_MAP_INDEX, Map, module_context_map)                         \
219  V(EVAL_CONTEXT_MAP_INDEX, Map, eval_context_map)                             \
220  V(SCRIPT_CONTEXT_MAP_INDEX, Map, script_context_map)                         \
221  V(AWAIT_CONTEXT_MAP_INDEX, Map, await_context_map)                           \
222  V(BLOCK_CONTEXT_MAP_INDEX, Map, block_context_map)                           \
223  V(CATCH_CONTEXT_MAP_INDEX, Map, catch_context_map)                           \
224  V(WITH_CONTEXT_MAP_INDEX, Map, with_context_map)                             \
225  V(DEBUG_EVALUATE_CONTEXT_MAP_INDEX, Map, debug_evaluate_context_map)         \
226  V(MAP_CACHE_INDEX, Object, map_cache)                                        \
227  V(MAP_KEY_ITERATOR_MAP_INDEX, Map, map_key_iterator_map)                     \
228  V(MAP_KEY_VALUE_ITERATOR_MAP_INDEX, Map, map_key_value_iterator_map)         \
229  V(MAP_VALUE_ITERATOR_MAP_INDEX, Map, map_value_iterator_map)                 \
230  V(MATH_RANDOM_INDEX_INDEX, Smi, math_random_index)                           \
231  V(MATH_RANDOM_STATE_INDEX, ByteArray, math_random_state)                     \
232  V(MATH_RANDOM_CACHE_INDEX, FixedDoubleArray, math_random_cache)              \
233  V(MESSAGE_LISTENERS_INDEX, TemplateList, message_listeners)                  \
234  V(NORMALIZED_MAP_CACHE_INDEX, Object, normalized_map_cache)                  \
235  V(NUMBER_FUNCTION_INDEX, JSFunction, number_function)                        \
236  V(OBJECT_FUNCTION_INDEX, JSFunction, object_function)                        \
237  V(OBJECT_FUNCTION_PROTOTYPE_INDEX, JSObject, object_function_prototype)      \
238  V(OBJECT_FUNCTION_PROTOTYPE_MAP_INDEX, Map, object_function_prototype_map)   \
239  V(PROMISE_HOOK_INIT_FUNCTION_INDEX, Object, promise_hook_init_function)      \
240  V(PROMISE_HOOK_BEFORE_FUNCTION_INDEX, Object, promise_hook_before_function)  \
241  V(PROMISE_HOOK_AFTER_FUNCTION_INDEX, Object, promise_hook_after_function)    \
242  V(PROMISE_HOOK_RESOLVE_FUNCTION_INDEX, Object,                               \
243    promise_hook_resolve_function)                                             \
244  V(PROXY_CALLABLE_MAP_INDEX, Map, proxy_callable_map)                         \
245  V(PROXY_CONSTRUCTOR_MAP_INDEX, Map, proxy_constructor_map)                   \
246  V(PROXY_FUNCTION_INDEX, JSFunction, proxy_function)                          \
247  V(PROXY_MAP_INDEX, Map, proxy_map)                                           \
248  V(PROXY_REVOCABLE_RESULT_MAP_INDEX, Map, proxy_revocable_result_map)         \
249  V(PROMISE_PROTOTYPE_INDEX, JSObject, promise_prototype)                      \
250  V(RECORDER_CONTEXT_ID, Object, recorder_context_id)                          \
251  V(REGEXP_EXEC_FUNCTION_INDEX, JSFunction, regexp_exec_function)              \
252  V(REGEXP_FUNCTION_INDEX, JSFunction, regexp_function)                        \
253  V(REGEXP_LAST_MATCH_INFO_INDEX, RegExpMatchInfo, regexp_last_match_info)     \
254  V(REGEXP_MATCH_ALL_FUNCTION_INDEX, JSFunction, regexp_match_all_function)    \
255  V(REGEXP_MATCH_FUNCTION_INDEX, JSFunction, regexp_match_function)            \
256  V(REGEXP_PROTOTYPE_INDEX, JSObject, regexp_prototype)                        \
257  V(REGEXP_PROTOTYPE_MAP_INDEX, Map, regexp_prototype_map)                     \
258  V(REGEXP_REPLACE_FUNCTION_INDEX, JSFunction, regexp_replace_function)        \
259  V(REGEXP_RESULT_MAP_INDEX, Map, regexp_result_map)                           \
260  V(REGEXP_RESULT_WITH_INDICES_MAP_INDEX, Map, regexp_result_with_indices_map) \
261  V(REGEXP_RESULT_INDICES_MAP_INDEX, Map, regexp_result_indices_map)           \
262  V(REGEXP_SEARCH_FUNCTION_INDEX, JSFunction, regexp_search_function)          \
263  V(REGEXP_SPLIT_FUNCTION_INDEX, JSFunction, regexp_split_function)            \
264  V(INITIAL_REGEXP_STRING_ITERATOR_PROTOTYPE_MAP_INDEX, Map,                   \
265    initial_regexp_string_iterator_prototype_map)                              \
266  V(SCRIPT_CONTEXT_TABLE_INDEX, ScriptContextTable, script_context_table)      \
267  V(SCRIPT_EXECUTION_CALLBACK_INDEX, Object, script_execution_callback)        \
268  V(SECURITY_TOKEN_INDEX, Object, security_token)                              \
269  V(SERIALIZED_OBJECTS, FixedArray, serialized_objects)                        \
270  V(SET_VALUE_ITERATOR_MAP_INDEX, Map, set_value_iterator_map)                 \
271  V(SET_KEY_VALUE_ITERATOR_MAP_INDEX, Map, set_key_value_iterator_map)         \
272  V(SHARED_ARRAY_BUFFER_FUN_INDEX, JSFunction, shared_array_buffer_fun)        \
273  V(SLOPPY_ARGUMENTS_MAP_INDEX, Map, sloppy_arguments_map)                     \
274  V(SLOW_ALIASED_ARGUMENTS_MAP_INDEX, Map, slow_aliased_arguments_map)         \
275  V(STRICT_ARGUMENTS_MAP_INDEX, Map, strict_arguments_map)                     \
276  V(SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP, Map,                                  \
277    slow_object_with_null_prototype_map)                                       \
278  V(SLOW_OBJECT_WITH_OBJECT_PROTOTYPE_MAP, Map,                                \
279    slow_object_with_object_prototype_map)                                     \
280  V(SLOW_TEMPLATE_INSTANTIATIONS_CACHE_INDEX, SimpleNumberDictionary,          \
281    slow_template_instantiations_cache)                                        \
282  V(ATOMICS_WAITASYNC_PROMISES, OrderedHashSet, atomics_waitasync_promises)    \
283  V(WASM_DEBUG_MAPS, FixedArray, wasm_debug_maps)                              \
284  /* Fast Path Protectors */                                                   \
285  V(REGEXP_SPECIES_PROTECTOR_INDEX, PropertyCell, regexp_species_protector)    \
286  /* All *_FUNCTION_MAP_INDEX definitions used by Context::FunctionMapIndex */ \
287  /* must remain together. */                                                  \
288  V(SLOPPY_FUNCTION_MAP_INDEX, Map, sloppy_function_map)                       \
289  V(SLOPPY_FUNCTION_WITH_NAME_MAP_INDEX, Map, sloppy_function_with_name_map)   \
290  V(SLOPPY_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map,                          \
291    sloppy_function_without_prototype_map)                                     \
292  V(SLOPPY_FUNCTION_WITH_READONLY_PROTOTYPE_MAP_INDEX, Map,                    \
293    sloppy_function_with_readonly_prototype_map)                               \
294  V(STRICT_FUNCTION_MAP_INDEX, Map, strict_function_map)                       \
295  V(STRICT_FUNCTION_WITH_NAME_MAP_INDEX, Map, strict_function_with_name_map)   \
296  V(STRICT_FUNCTION_WITH_READONLY_PROTOTYPE_MAP_INDEX, Map,                    \
297    strict_function_with_readonly_prototype_map)                               \
298  V(STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map,                          \
299    strict_function_without_prototype_map)                                     \
300  V(METHOD_WITH_NAME_MAP_INDEX, Map, method_with_name_map)                     \
301  V(ASYNC_FUNCTION_MAP_INDEX, Map, async_function_map)                         \
302  V(ASYNC_FUNCTION_WITH_NAME_MAP_INDEX, Map, async_function_with_name_map)     \
303  V(GENERATOR_FUNCTION_MAP_INDEX, Map, generator_function_map)                 \
304  V(GENERATOR_FUNCTION_WITH_NAME_MAP_INDEX, Map,                               \
305    generator_function_with_name_map)                                          \
306  V(ASYNC_GENERATOR_FUNCTION_MAP_INDEX, Map, async_generator_function_map)     \
307  V(ASYNC_GENERATOR_FUNCTION_WITH_NAME_MAP_INDEX, Map,                         \
308    async_generator_function_with_name_map)                                    \
309  V(CLASS_FUNCTION_MAP_INDEX, Map, class_function_map)                         \
310  V(STRING_FUNCTION_INDEX, JSFunction, string_function)                        \
311  V(STRING_FUNCTION_PROTOTYPE_MAP_INDEX, Map, string_function_prototype_map)   \
312  V(SYMBOL_FUNCTION_INDEX, JSFunction, symbol_function)                        \
313  V(WASM_EXPORTED_FUNCTION_MAP_INDEX, Map, wasm_exported_function_map)         \
314  V(WASM_TAG_CONSTRUCTOR_INDEX, JSFunction, wasm_tag_constructor)              \
315  V(WASM_EXCEPTION_CONSTRUCTOR_INDEX, JSFunction, wasm_exception_constructor)  \
316  V(WASM_GLOBAL_CONSTRUCTOR_INDEX, JSFunction, wasm_global_constructor)        \
317  V(WASM_INSTANCE_CONSTRUCTOR_INDEX, JSFunction, wasm_instance_constructor)    \
318  V(WASM_MEMORY_CONSTRUCTOR_INDEX, JSFunction, wasm_memory_constructor)        \
319  V(WASM_MODULE_CONSTRUCTOR_INDEX, JSFunction, wasm_module_constructor)        \
320  V(WASM_TABLE_CONSTRUCTOR_INDEX, JSFunction, wasm_table_constructor)          \
321  V(WASM_SUSPENDER_CONSTRUCTOR_INDEX, JSFunction, wasm_suspender_constructor)  \
322  V(TEMPLATE_WEAKMAP_INDEX, HeapObject, template_weakmap)                      \
323  V(TYPED_ARRAY_FUN_INDEX, JSFunction, typed_array_function)                   \
324  V(TYPED_ARRAY_PROTOTYPE_INDEX, JSObject, typed_array_prototype)              \
325  V(ARRAY_ENTRIES_ITERATOR_INDEX, JSFunction, array_entries_iterator)          \
326  V(ARRAY_FOR_EACH_ITERATOR_INDEX, JSFunction, array_for_each_iterator)        \
327  V(ARRAY_KEYS_ITERATOR_INDEX, JSFunction, array_keys_iterator)                \
328  V(ARRAY_VALUES_ITERATOR_INDEX, JSFunction, array_values_iterator)            \
329  V(ERROR_FUNCTION_INDEX, JSFunction, error_function)                          \
330  V(ERROR_TO_STRING, JSFunction, error_to_string)                              \
331  V(EVAL_ERROR_FUNCTION_INDEX, JSFunction, eval_error_function)                \
332  V(AGGREGATE_ERROR_FUNCTION_INDEX, JSFunction, aggregate_error_function)      \
333  V(GLOBAL_EVAL_FUN_INDEX, JSFunction, global_eval_fun)                        \
334  V(GLOBAL_PARSE_FLOAT_FUN_INDEX, JSFunction, global_parse_float_fun)          \
335  V(GLOBAL_PARSE_INT_FUN_INDEX, JSFunction, global_parse_int_fun)              \
336  V(GLOBAL_PROXY_FUNCTION_INDEX, JSFunction, global_proxy_function)            \
337  V(MAP_DELETE_INDEX, JSFunction, map_delete)                                  \
338  V(MAP_GET_INDEX, JSFunction, map_get)                                        \
339  V(MAP_HAS_INDEX, JSFunction, map_has)                                        \
340  V(MAP_SET_INDEX, JSFunction, map_set)                                        \
341  V(FINALIZATION_REGISTRY_CLEANUP_SOME, JSFunction,                            \
342    finalization_registry_cleanup_some)                                        \
343  V(FUNCTION_HAS_INSTANCE_INDEX, JSFunction, function_has_instance)            \
344  V(FUNCTION_TO_STRING_INDEX, JSFunction, function_to_string)                  \
345  V(OBJECT_TO_STRING, JSFunction, object_to_string)                            \
346  V(OBJECT_VALUE_OF_FUNCTION_INDEX, JSFunction, object_value_of_function)      \
347  V(PROMISE_ALL_INDEX, JSFunction, promise_all)                                \
348  V(PROMISE_ALL_SETTLED_INDEX, JSFunction, promise_all_settled)                \
349  V(PROMISE_ANY_INDEX, JSFunction, promise_any)                                \
350  V(PROMISE_FUNCTION_INDEX, JSFunction, promise_function)                      \
351  V(RANGE_ERROR_FUNCTION_INDEX, JSFunction, range_error_function)              \
352  V(REFERENCE_ERROR_FUNCTION_INDEX, JSFunction, reference_error_function)      \
353  V(SET_ADD_INDEX, JSFunction, set_add)                                        \
354  V(SET_DELETE_INDEX, JSFunction, set_delete)                                  \
355  V(SET_HAS_INDEX, JSFunction, set_has)                                        \
356  V(SYNTAX_ERROR_FUNCTION_INDEX, JSFunction, syntax_error_function)            \
357  V(TYPE_ERROR_FUNCTION_INDEX, JSFunction, type_error_function)                \
358  V(URI_ERROR_FUNCTION_INDEX, JSFunction, uri_error_function)                  \
359  V(WASM_COMPILE_ERROR_FUNCTION_INDEX, JSFunction,                             \
360    wasm_compile_error_function)                                               \
361  V(WASM_LINK_ERROR_FUNCTION_INDEX, JSFunction, wasm_link_error_function)      \
362  V(WASM_RUNTIME_ERROR_FUNCTION_INDEX, JSFunction,                             \
363    wasm_runtime_error_function)                                               \
364  V(WASM_EXCEPTION_ERROR_FUNCTION_INDEX, JSFunction,                           \
365    wasm_exception_error_function)                                             \
366  V(WEAKMAP_SET_INDEX, JSFunction, weakmap_set)                                \
367  V(WEAKMAP_GET_INDEX, JSFunction, weakmap_get)                                \
368  V(WEAKMAP_DELETE_INDEX, JSFunction, weakmap_delete)                          \
369  V(WEAKSET_ADD_INDEX, JSFunction, weakset_add)                                \
370  V(WRAPPED_FUNCTION_MAP_INDEX, Map, wrapped_function_map)                     \
371  V(RETAINED_MAPS, Object, retained_maps)                                      \
372  V(OSR_CODE_CACHE_INDEX, OSROptimizedCodeCache, osr_code_cache)
373
374#include "torque-generated/src/objects/contexts-tq.inc"
375
376// A table of all script contexts. Every loaded top-level script with top-level
377// lexical declarations contributes its ScriptContext into this table.
378//
379// The table is a fixed array, its first slot is the current used count and
380// the subsequent slots 1..used contain ScriptContexts.
381
382struct VariableLookupResult;
383class ScriptContextTable : public FixedArray {
384 public:
385  DECL_CAST(ScriptContextTable)
386
387  DECL_RELEASE_ACQUIRE_INT_ACCESSORS(used)
388
389  static inline Handle<Context> GetContext(Isolate* isolate,
390                                           Handle<ScriptContextTable> table,
391                                           int i);
392  inline Context get_context(int i) const;
393  inline Context get_context(int i, AcquireLoadTag tag) const;
394
395  DECL_ACCESSORS(names_to_context_index, NameToIndexHashTable)
396
397  // Adds local names from `script_context` to the hash table.
398  static void AddLocalNamesFromContext(
399      Isolate* isolate, Handle<ScriptContextTable> script_context_table,
400      Handle<Context> script_context, bool ignore_duplicates,
401      int script_context_index);
402
403  // Lookup a variable `name` in a ScriptContextTable.
404  // If it returns true, the variable is found and `result` contains
405  // valid information about its location.
406  // If it returns false, `result` is untouched.
407  V8_WARN_UNUSED_RESULT
408  V8_EXPORT_PRIVATE bool Lookup(Handle<String> name,
409                                VariableLookupResult* result);
410
411  V8_WARN_UNUSED_RESULT
412  V8_EXPORT_PRIVATE static Handle<ScriptContextTable> Extend(
413      Isolate* isolate, Handle<ScriptContextTable> table,
414      Handle<Context> script_context, bool ignore_duplicates = false);
415
416  static const int kHashTableIndex = 0;
417  static const int kUsedSlotIndex = 1;
418  static const int kFirstContextSlotIndex = 2;
419  static const int kMinLength = kFirstContextSlotIndex;
420
421  static const int kHashTableOffset = OffsetOfElementAt(kHashTableIndex);
422
423  OBJECT_CONSTRUCTORS(ScriptContextTable, FixedArray);
424};
425
426// JSFunctions are pairs (context, function code), sometimes also called
427// closures. A Context object is used to represent function contexts and
428// dynamically pushed 'with' contexts (or 'scopes' in ECMA-262 speak).
429//
430// At runtime, the contexts build a stack in parallel to the execution
431// stack, with the top-most context being the current context. All contexts
432// have the following slots:
433//
434// [ scope_info     ]  This is the scope info describing the current context. It
435//                     contains the names of statically allocated context slots,
436//                     and stack-allocated locals.  The names are needed for
437//                     dynamic lookups in the presence of 'with' or 'eval', and
438//                     for the debugger.
439//
440// [ previous       ]  A pointer to the previous context.
441//
442// [ extension      ]  Additional data. This slot is only available when
443//                     ScopeInfo::HasContextExtensionSlot returns true.
444//
445//                     For native contexts, it contains the global object.
446//                     For module contexts, it contains the module object.
447//                     For await contexts, it contains the generator object.
448//                     For var block contexts, it may contain an "extension
449//                     object".
450//                     For with contexts, it contains an "extension object".
451//
452//                     An "extension object" is used to dynamically extend a
453//                     context with additional variables, namely in the
454//                     implementation of the 'with' construct and the 'eval'
455//                     construct.  For instance, Context::Lookup also searches
456//                     the extension object for properties.  (Storing the
457//                     extension object is the original purpose of this context
458//                     slot, hence the name.)
459//
460// In addition, function contexts with sloppy eval may have statically
461// allocated context slots to store local variables/functions that are accessed
462// from inner functions (via static context addresses) or through 'eval'
463// (dynamic context lookups).
464// The native context contains additional slots for fast access to native
465// properties.
466//
467// Finally, with Harmony scoping, the JSFunction representing a top level
468// script will have the ScriptContext rather than a FunctionContext.
469// Script contexts from all top-level scripts are gathered in
470// ScriptContextTable.
471
472class Context : public TorqueGeneratedContext<Context, HeapObject> {
473 public:
474  NEVER_READ_ONLY_SPACE
475
476  using TorqueGeneratedContext::length;      // Non-atomic.
477  using TorqueGeneratedContext::set_length;  // Non-atomic.
478  DECL_RELAXED_SMI_ACCESSORS(length)
479
480  // Setter and getter for elements.
481  // Note the plain accessors use relaxed semantics.
482  // TODO(jgruber): Make that explicit through tags.
483  V8_INLINE Object get(int index) const;
484  V8_INLINE Object get(PtrComprCageBase cage_base, int index) const;
485  V8_INLINE void set(int index, Object value,
486                     WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
487  // Accessors with acquire-release semantics.
488  V8_INLINE Object get(int index, AcquireLoadTag) const;
489  V8_INLINE Object get(PtrComprCageBase cage_base, int index,
490                       AcquireLoadTag) const;
491  V8_INLINE void set(int index, Object value, WriteBarrierMode mode,
492                     ReleaseStoreTag);
493
494  static const int kScopeInfoOffset = kElementsOffset;
495  static const int kPreviousOffset = kScopeInfoOffset + kTaggedSize;
496
497  /* Header size. */                                                  \
498  /* TODO(ishell): use this as header size once MIN_CONTEXT_SLOTS */  \
499  /* is removed in favour of offset-based access to common fields. */ \
500  static const int kTodoHeaderSize = kPreviousOffset + kTaggedSize;
501
502  // If the extension slot exists, it is the first slot after the header.
503  static const int kExtensionOffset = kTodoHeaderSize;
504
505  // Garbage collection support.
506  V8_INLINE static constexpr int SizeFor(int length) {
507    // TODO(v8:9287): This is a workaround for GCMole build failures.
508    int result = kElementsOffset + length * kTaggedSize;
509    DCHECK_EQ(TorqueGeneratedContext::SizeFor(length), result);
510    return result;
511  }
512
513  // Code Generation support.
514  // Offset of the element from the beginning of object.
515  V8_INLINE static constexpr int OffsetOfElementAt(int index) {
516    return SizeFor(index);
517  }
518  // Offset of the element from the heap object pointer.
519  V8_INLINE static constexpr int SlotOffset(int index) {
520    return OffsetOfElementAt(index) - kHeapObjectTag;
521  }
522
523  // Initializes the variable slots of the context. Lexical variables that need
524  // initialization are filled with the hole.
525  void Initialize(Isolate* isolate);
526
527  // TODO(ishell): eventually migrate to the offset based access instead of
528  // index-based.
529  // The default context slot layout; indices are FixedArray slot indices.
530  enum Field {
531    // TODO(shell): use offset-based approach for accessing common values.
532    // These slots are in all contexts.
533    SCOPE_INFO_INDEX,
534    PREVIOUS_INDEX,
535
536    // This slot only exists if ScopeInfo::HasContextExtensionSlot returns true.
537    EXTENSION_INDEX,
538
539// These slots are only in native contexts.
540#define NATIVE_CONTEXT_SLOT(index, type, name) index,
541    NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_SLOT)
542#undef NATIVE_CONTEXT_SLOT
543
544    // Properties from here are treated as weak references by the full GC.
545    // Scavenge treats them as strong references.
546    OPTIMIZED_CODE_LIST,    // Weak.
547    DEOPTIMIZED_CODE_LIST,  // Weak.
548    NEXT_CONTEXT_LINK,      // Weak.
549
550    // Total number of slots.
551    NATIVE_CONTEXT_SLOTS,
552    FIRST_WEAK_SLOT = OPTIMIZED_CODE_LIST,
553    FIRST_JS_ARRAY_MAP_SLOT = JS_ARRAY_PACKED_SMI_ELEMENTS_MAP_INDEX,
554
555    // TODO(shell): Remove, once it becomes zero
556    MIN_CONTEXT_SLOTS = EXTENSION_INDEX,
557    MIN_CONTEXT_EXTENDED_SLOTS = EXTENSION_INDEX + 1,
558
559    // This slot holds the thrown value in catch contexts.
560    THROWN_OBJECT_INDEX = MIN_CONTEXT_SLOTS,
561
562    // These slots hold values in debug evaluate contexts.
563    WRAPPED_CONTEXT_INDEX = MIN_CONTEXT_EXTENDED_SLOTS
564  };
565
566  static const int kExtensionSize =
567      (MIN_CONTEXT_EXTENDED_SLOTS - MIN_CONTEXT_SLOTS) * kTaggedSize;
568  static const int kExtendedHeaderSize = kTodoHeaderSize + kExtensionSize;
569
570  // A region of native context entries containing maps for functions created
571  // by Builtin::kFastNewClosure.
572  static const int FIRST_FUNCTION_MAP_INDEX = SLOPPY_FUNCTION_MAP_INDEX;
573  static const int LAST_FUNCTION_MAP_INDEX = CLASS_FUNCTION_MAP_INDEX;
574
575  static const int FIRST_FIXED_TYPED_ARRAY_FUN_INDEX = UINT8_ARRAY_FUN_INDEX;
576  static const int FIRST_RAB_GSAB_TYPED_ARRAY_MAP_INDEX =
577      RAB_GSAB_UINT8_ARRAY_MAP_INDEX;
578
579  static const int kNoContext = 0;
580  static const int kInvalidContext = 1;
581
582  // Direct slot access.
583  DECL_ACCESSORS(scope_info, ScopeInfo)
584
585  inline Object unchecked_previous() const;
586  inline Context previous() const;
587
588  inline Object next_context_link() const;
589
590  inline bool has_extension() const;
591  inline HeapObject extension() const;
592  V8_EXPORT_PRIVATE void set_extension(
593      HeapObject object, WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
594  JSObject extension_object() const;
595  JSReceiver extension_receiver() const;
596
597  // Find the module context (assuming there is one) and return the associated
598  // module object.
599  SourceTextModule module() const;
600
601  // Get the context where var declarations will be hoisted to, which
602  // may be the context itself.
603  Context declaration_context() const;
604  bool is_declaration_context() const;
605
606  // Get the next closure's context on the context chain.
607  Context closure_context() const;
608
609  // Returns a JSGlobalProxy object or null.
610  V8_EXPORT_PRIVATE JSGlobalProxy global_proxy() const;
611
612  // Get the JSGlobalObject object.
613  V8_EXPORT_PRIVATE JSGlobalObject global_object() const;
614
615  // Get the script context by traversing the context chain.
616  Context script_context() const;
617
618  // Compute the native context.
619  inline NativeContext native_context() const;
620
621  // Predicates for context types.  IsNativeContext is already defined on
622  // Object.
623  inline bool IsFunctionContext() const;
624  inline bool IsCatchContext() const;
625  inline bool IsWithContext() const;
626  inline bool IsDebugEvaluateContext() const;
627  inline bool IsAwaitContext() const;
628  inline bool IsBlockContext() const;
629  inline bool IsModuleContext() const;
630  inline bool IsEvalContext() const;
631  inline bool IsScriptContext() const;
632
633  inline bool HasSameSecurityTokenAs(Context that) const;
634
635  Handle<Object> ErrorMessageForCodeGenerationFromStrings();
636
637  static int IntrinsicIndexForName(Handle<String> name);
638  static int IntrinsicIndexForName(const unsigned char* name, int length);
639
640#define NATIVE_CONTEXT_FIELD_ACCESSORS(index, type, name) \
641  inline void set_##name(type value);                     \
642  inline bool is_##name(type value) const;                \
643  inline type name() const;                               \
644  inline type name(AcquireLoadTag) const;
645  NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSORS)
646#undef NATIVE_CONTEXT_FIELD_ACCESSORS
647
648  // Lookup the slot called name, starting with the current context.
649  // There are three possibilities:
650  //
651  // 1) result->IsContext():
652  //    The binding was found in a context.  *index is always the
653  //    non-negative slot index.  *attributes is NONE for var and let
654  //    declarations, READ_ONLY for const declarations (never ABSENT).
655  //
656  // 2) result->IsJSObject():
657  //    The binding was found as a named property in a context extension
658  //    object (i.e., was introduced via eval), as a property on the subject
659  //    of with, or as a property of the global object.  *index is -1 and
660  //    *attributes is not ABSENT.
661  //
662  // 3) result->IsModule():
663  //    The binding was found in module imports or exports.
664  //     *attributes is never ABSENT. imports are READ_ONLY.
665  //
666  // 4) result.is_null():
667  //    There was no binding found, *index is always -1 and *attributes is
668  //    always ABSENT.
669  static Handle<Object> Lookup(Handle<Context> context, Handle<String> name,
670                               ContextLookupFlags flags, int* index,
671                               PropertyAttributes* attributes,
672                               InitializationFlag* init_flag,
673                               VariableMode* variable_mode,
674                               bool* is_sloppy_function_name = nullptr);
675
676  static inline int FunctionMapIndex(LanguageMode language_mode,
677                                     FunctionKind kind, bool has_shared_name);
678
679  static int ArrayMapIndex(ElementsKind elements_kind) {
680    DCHECK(IsFastElementsKind(elements_kind));
681    return elements_kind + FIRST_JS_ARRAY_MAP_SLOT;
682  }
683
684  inline Map GetInitialJSArrayMap(ElementsKind kind) const;
685
686  static const int kNotFound = -1;
687
688  // Dispatched behavior.
689  DECL_PRINTER(Context)
690  DECL_VERIFIER(Context)
691
692  class BodyDescriptor;
693
694#ifdef VERIFY_HEAP
695  V8_EXPORT_PRIVATE void VerifyExtensionSlot(HeapObject extension);
696#endif
697
698 private:
699#ifdef DEBUG
700  // Bootstrapping-aware type checks.
701  static bool IsBootstrappingOrValidParentContext(Object object, Context kid);
702#endif
703
704  friend class Factory;
705  inline void set_previous(Context context,
706                           WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
707
708  TQ_OBJECT_CONSTRUCTORS(Context)
709};
710
711class NativeContext : public Context {
712 public:
713  DECL_CAST(NativeContext)
714  // TODO(neis): Move some stuff from Context here.
715
716  inline void AllocateExternalPointerEntries(Isolate* isolate);
717
718  // NativeContext fields are read concurrently from background threads; any
719  // concurrent writes of affected fields must have acquire-release semantics,
720  // thus we hide the non-atomic setter. Note this doesn't protect fully since
721  // one could still use Context::set and/or write directly using offsets (e.g.
722  // from CSA/Torque).
723  void set(int index, Object value, WriteBarrierMode mode) = delete;
724  V8_INLINE void set(int index, Object value, WriteBarrierMode mode,
725                     ReleaseStoreTag);
726
727  // [microtask_queue]: pointer to the MicrotaskQueue object.
728  DECL_GETTER(microtask_queue, MicrotaskQueue*)
729  inline void set_microtask_queue(Isolate* isolate, MicrotaskQueue* queue);
730
731  inline void synchronized_set_script_context_table(
732      ScriptContextTable script_context_table);
733  inline ScriptContextTable synchronized_script_context_table() const;
734
735  // Caution, hack: this getter ignores the AcquireLoadTag. The global_object
736  // slot is safe to read concurrently since it is immutable after
737  // initialization.  This function should *not* be used from anywhere other
738  // than heap-refs.cc.
739  // TODO(jgruber): Remove this function after NativeContextRef is actually
740  // never serialized and BROKER_NATIVE_CONTEXT_FIELDS is removed.
741  JSGlobalObject global_object() { return Context::global_object(); }
742  JSGlobalObject global_object(AcquireLoadTag) {
743    return Context::global_object();
744  }
745
746  // Dispatched behavior.
747  DECL_PRINTER(NativeContext)
748  DECL_VERIFIER(NativeContext)
749
750  // Layout description.
751#define NATIVE_CONTEXT_FIELDS_DEF(V)                                        \
752  /* TODO(ishell): move definition of common context offsets to Context. */ \
753  V(kStartOfNativeContextFieldsOffset,                                      \
754    (FIRST_WEAK_SLOT - MIN_CONTEXT_EXTENDED_SLOTS) * kTaggedSize)           \
755  V(kEndOfStrongFieldsOffset, 0)                                            \
756  V(kStartOfWeakFieldsOffset,                                               \
757    (NATIVE_CONTEXT_SLOTS - FIRST_WEAK_SLOT) * kTaggedSize)                 \
758  V(kEndOfWeakFieldsOffset, 0)                                              \
759  V(kEndOfNativeContextFieldsOffset, 0)                                     \
760  V(kEndOfTaggedFieldsOffset, 0)                                            \
761  /* Raw data. */                                                           \
762  V(kMicrotaskQueueOffset, kSystemPointerSize)                              \
763  /* Total size. */                                                         \
764  V(kSize, 0)
765
766  DEFINE_FIELD_OFFSET_CONSTANTS(Context::kExtendedHeaderSize,
767                                NATIVE_CONTEXT_FIELDS_DEF)
768#undef NATIVE_CONTEXT_FIELDS_DEF
769
770  class BodyDescriptor;
771
772  // The native context stores a list of all optimized code and a list of all
773  // deoptimized code, which are needed by the deoptimizer.
774  V8_EXPORT_PRIVATE void AddOptimizedCode(CodeT code);
775  inline void SetOptimizedCodeListHead(Object head);
776  inline Object OptimizedCodeListHead();
777  inline void SetDeoptimizedCodeListHead(Object head);
778  inline Object DeoptimizedCodeListHead();
779
780  void ResetErrorsThrown();
781  void IncrementErrorsThrown();
782  int GetErrorsThrown();
783
784#ifdef V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS
785  void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise,
786                      Handle<Object> parent);
787#endif
788
789 private:
790  STATIC_ASSERT(OffsetOfElementAt(EMBEDDER_DATA_INDEX) ==
791                Internals::kNativeContextEmbedderDataOffset);
792
793  OBJECT_CONSTRUCTORS(NativeContext, Context);
794};
795
796using ContextField = Context::Field;
797
798}  // namespace internal
799}  // namespace v8
800
801#include "src/objects/object-macros-undef.h"
802
803#endif  // V8_OBJECTS_CONTEXTS_H_
804