xref: /third_party/node/deps/v8/src/objects/contexts.tq (revision 1cb0ef41)
1// Copyright 2019 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@abstract
6// We normally don't generate a BodyDescriptor for an abstact class, but here we
7// do since all context classes share the same BodyDescriptor.
8@generateBodyDescriptor
9extern class Context extends HeapObject {
10  macro GetScopeInfo(): ScopeInfo {
11    return *ContextSlot(this, ContextSlot::SCOPE_INFO_INDEX);
12  }
13  const length: Smi;
14  elements[length]: Object;
15}
16
17extern class AwaitContext extends Context generates 'TNode<Context>';
18extern class BlockContext extends Context generates 'TNode<Context>';
19extern class CatchContext extends Context generates 'TNode<Context>';
20extern class DebugEvaluateContext extends Context
21    generates 'TNode<Context>';
22extern class EvalContext extends Context generates 'TNode<Context>';
23extern class ModuleContext extends Context generates 'TNode<Context>';
24extern class ScriptContext extends Context generates 'TNode<Context>';
25extern class WithContext extends Context generates 'TNode<Context>';
26
27extern class FunctionContext extends Context generates 'TNode<Context>';
28
29const kInitialContextSlotValue: Smi = 0;
30
31@export
32macro AllocateSyntheticFunctionContext(
33    nativeContext: NativeContext, slots: constexpr int31): FunctionContext {
34  return AllocateSyntheticFunctionContext(
35      nativeContext, Convert<intptr>(slots));
36}
37
38macro AllocateSyntheticFunctionContext(
39    nativeContext: NativeContext, slots: intptr): FunctionContext {
40  static_assert(slots >= ContextSlot::MIN_CONTEXT_SLOTS);
41  const map =
42      *ContextSlot(nativeContext, ContextSlot::FUNCTION_CONTEXT_MAP_INDEX);
43  const result = new FunctionContext{
44    map,
45    length: Convert<Smi>(slots),
46    elements: ...ConstantIterator<Smi>(kInitialContextSlotValue)
47  };
48  InitContextSlot(result, ContextSlot::SCOPE_INFO_INDEX, kEmptyScopeInfo);
49  InitContextSlot(result, ContextSlot::PREVIOUS_INDEX, Undefined);
50  return result;
51}
52
53extern class NativeContext extends Context;
54
55type Slot<Container : type extends Context, T : type extends Object> extends
56    intptr;
57
58// We cannot use ContextSlot() for initialization since that one asserts the
59// slot has the right type already.
60macro InitContextSlot<
61    ArgumentContext: type, AnnotatedContext: type, T: type, U: type>(
62    context: ArgumentContext, index: Slot<AnnotatedContext, T>,
63    value: U): void {
64  // Make sure the arguments have the right type.
65  const context: AnnotatedContext = context;
66  const value: T = value;
67  dcheck(TaggedEqual(context.elements[index], kInitialContextSlotValue));
68  context.elements[index] = value;
69}
70
71macro ContextSlot<ArgumentContext: type, AnnotatedContext: type, T: type>(
72    context: ArgumentContext, index: Slot<AnnotatedContext, T>):&T {
73  const context: AnnotatedContext = context;
74  return torque_internal::unsafe::ReferenceCast<T>(&context.elements[index]);
75}
76
77macro NativeContextSlot<T: type>(
78    context: NativeContext, index: Slot<NativeContext, T>):&T {
79  return ContextSlot(context, index);
80}
81macro NativeContextSlot<T: type>(
82    context: Context, index: Slot<NativeContext, T>):&T {
83  return ContextSlot(LoadNativeContext(context), index);
84}
85macro NativeContextSlot<C: type, T: type>(implicit context: C)(
86    index: Slot<NativeContext, T>):&T {
87  return NativeContextSlot(context, index);
88}
89
90extern enum ContextSlot extends intptr constexpr 'Context::Field' {
91  SCOPE_INFO_INDEX: Slot<Context, ScopeInfo>,
92  // Zero is used for the NativeContext, Undefined is used for synthetic
93  // function contexts.
94  PREVIOUS_INDEX: Slot<Context, Context|Zero|Undefined>,
95
96  AGGREGATE_ERROR_FUNCTION_INDEX: Slot<NativeContext, JSFunction>,
97  ARRAY_BUFFER_FUN_INDEX: Slot<NativeContext, Constructor>,
98  ARRAY_BUFFER_NOINIT_FUN_INDEX: Slot<NativeContext, JSFunction>,
99  ARRAY_BUFFER_MAP_INDEX: Slot<NativeContext, Map>,
100  ARRAY_FUNCTION_INDEX: Slot<NativeContext, JSFunction>,
101  ARRAY_JOIN_STACK_INDEX: Slot<NativeContext, Undefined|FixedArray>,
102  OBJECT_FUNCTION_INDEX: Slot<NativeContext, JSFunction>,
103  ITERATOR_RESULT_MAP_INDEX: Slot<NativeContext, Map>,
104  JS_ARRAY_PACKED_ELEMENTS_MAP_INDEX: Slot<NativeContext, Map>,
105  JS_ARRAY_PACKED_SMI_ELEMENTS_MAP_INDEX: Slot<NativeContext, Map>,
106  MATH_RANDOM_CACHE_INDEX: Slot<NativeContext, FixedDoubleArray>,
107  MATH_RANDOM_INDEX_INDEX: Slot<NativeContext, Smi>,
108  NUMBER_FUNCTION_INDEX: Slot<NativeContext, JSFunction>,
109  PROXY_REVOCABLE_RESULT_MAP_INDEX: Slot<NativeContext, Map>,
110  REFLECT_APPLY_INDEX: Slot<NativeContext, Callable>,
111  REGEXP_FUNCTION_INDEX: Slot<NativeContext, JSFunction>,
112  REGEXP_LAST_MATCH_INFO_INDEX: Slot<NativeContext, RegExpMatchInfo>,
113  INITIAL_STRING_ITERATOR_MAP_INDEX: Slot<NativeContext, Map>,
114  INITIAL_ARRAY_ITERATOR_MAP_INDEX: Slot<NativeContext, Map>,
115  SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP: Slot<NativeContext, Map>,
116  STRICT_ARGUMENTS_MAP_INDEX: Slot<NativeContext, Map>,
117  SLOPPY_ARGUMENTS_MAP_INDEX: Slot<NativeContext, Map>,
118  FAST_ALIASED_ARGUMENTS_MAP_INDEX: Slot<NativeContext, Map>,
119  FUNCTION_CONTEXT_MAP_INDEX: Slot<NativeContext, Map>,
120  FUNCTION_PROTOTYPE_APPLY_INDEX: Slot<NativeContext, JSFunction>,
121
122  UINT8_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
123  INT8_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
124  UINT16_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
125  INT16_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
126  UINT32_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
127  INT32_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
128  FLOAT32_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
129  FLOAT64_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
130  UINT8_CLAMPED_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
131  BIGUINT64_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
132  BIGINT64_ARRAY_FUN_INDEX: Slot<NativeContext, JSFunction>,
133
134  RAB_GSAB_UINT8_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
135  RAB_GSAB_INT8_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
136  RAB_GSAB_UINT16_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
137  RAB_GSAB_INT16_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
138  RAB_GSAB_UINT32_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
139  RAB_GSAB_INT32_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
140  RAB_GSAB_FLOAT32_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
141  RAB_GSAB_FLOAT64_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
142  RAB_GSAB_UINT8_CLAMPED_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
143  RAB_GSAB_BIGUINT64_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
144  RAB_GSAB_BIGINT64_ARRAY_MAP_INDEX: Slot<NativeContext, Map>,
145
146  PROMISE_FUNCTION_INDEX: Slot<NativeContext, JSFunction>,
147  PROMISE_THEN_INDEX: Slot<NativeContext, JSFunction>,
148  PROMISE_PROTOTYPE_INDEX: Slot<NativeContext, JSObject>,
149  STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX: Slot<NativeContext, Map>,
150
151  PROMISE_HOOK_INIT_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
152  PROMISE_HOOK_BEFORE_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
153  PROMISE_HOOK_AFTER_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
154  PROMISE_HOOK_RESOLVE_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
155
156  CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX: Slot<NativeContext, HeapObject>,
157
158  BOUND_FUNCTION_WITH_CONSTRUCTOR_MAP_INDEX: Slot<NativeContext, Map>,
159  BOUND_FUNCTION_WITHOUT_CONSTRUCTOR_MAP_INDEX: Slot<NativeContext, Map>,
160
161  WRAPPED_FUNCTION_MAP_INDEX: Slot<NativeContext, Map>,
162
163  MIN_CONTEXT_SLOTS,
164  ...
165}
166
167@export
168macro LoadContextElement(c: Context, i: intptr): Object {
169  return c.elements[i];
170}
171
172@export
173macro LoadContextElement(c: Context, i: Smi): Object {
174  return c.elements[i];
175}
176
177@export
178macro LoadContextElement(c: Context, i: constexpr int32): Object {
179  return c.elements[i];
180}
181
182@export
183macro StoreContextElement(c: Context, i: intptr, o: Object): void {
184  c.elements[i] = o;
185}
186
187@export
188macro StoreContextElement(c: Context, i: Smi, o: Object): void {
189  c.elements[i] = o;
190}
191
192@export
193macro StoreContextElement(c: Context, i: constexpr int32, o: Object): void {
194  c.elements[i] = o;
195}
196
197// A dummy used instead of a context constant for runtime calls that don't need
198// a context.
199type NoContext extends Smi;
200extern macro NoContextConstant(): NoContext;
201const kNoContext: NoContext = NoContextConstant();
202