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