v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
contexts-inl.h
Go to the documentation of this file.
1// Copyright 2015 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_INL_H_
6#define V8_OBJECTS_CONTEXTS_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
11#include "src/common/globals.h"
13#include "src/objects/casting.h"
18#include "src/objects/map-inl.h"
24
25// Has to be the last include (doesn't have include guards):
27
28namespace v8 {
29namespace internal {
30
31#include "torque-generated/src/objects/contexts-tq-inl.inc"
32
34 return length_.Acquire_Load().value();
35}
37 length_.Release_Store(this, Smi::FromInt(value));
38}
39
41 const {
42 return names_to_context_index_.load();
43}
46 names_to_context_index_.store(this, value, mode);
47}
48
53
55 DCHECK_LT(i, length(tag));
56 return Super::get(i, tag);
57}
58
61
62RELAXED_SMI_ACCESSORS(Context, length, kLengthOffset)
63
64Tagged<Object> Context::get(int index) const {
65 PtrComprCageBase cage_base = GetPtrComprCageBase(*this);
66 return get(cage_base, index);
67}
68
69Tagged<Object> Context::get(PtrComprCageBase cage_base, int index) const {
70 DCHECK_LT(static_cast<unsigned int>(index),
71 static_cast<unsigned int>(length(kRelaxedLoad)));
72 return TaggedField<Object>::Relaxed_Load(cage_base, *this,
73 OffsetOfElementAt(index));
74}
75
76void Context::set(int index, Tagged<Object> value, WriteBarrierMode mode) {
77 DCHECK_LT(static_cast<unsigned int>(index),
78 static_cast<unsigned int>(length(kRelaxedLoad)));
79 const int offset = OffsetOfElementAt(index);
80 RELAXED_WRITE_FIELD(*this, offset, value);
81 CONDITIONAL_WRITE_BARRIER(*this, offset, value, mode);
82}
83
85 PtrComprCageBase cage_base = GetPtrComprCageBase(*this);
86 return get(cage_base, index, tag);
87}
88
90 AcquireLoadTag) const {
91 DCHECK_LT(static_cast<unsigned int>(index),
92 static_cast<unsigned int>(length(kRelaxedLoad)));
93 return ACQUIRE_READ_FIELD(*this, OffsetOfElementAt(index));
94}
95
96void Context::set(int index, Tagged<Object> value, WriteBarrierMode mode,
98 DCHECK_LT(static_cast<unsigned int>(index),
99 static_cast<unsigned int>(length(kRelaxedLoad)));
100 const int offset = OffsetOfElementAt(index);
101 RELEASE_WRITE_FIELD(*this, offset, value);
102 CONDITIONAL_WRITE_BARRIER(*this, offset, value, mode);
103}
104
106 ReleaseStoreTag tag) {
107 Context::set(index, value, mode, tag);
108}
109
110ACCESSORS(Context, scope_info, Tagged<ScopeInfo>, kScopeInfoOffset)
111
112Tagged<Object> Context::unchecked_previous() const {
113 return get(PREVIOUS_INDEX);
114}
115
118 DCHECK(IsBootstrappingOrValidParentContext(result, *this));
120}
122 set(PREVIOUS_INDEX, context, mode);
123}
124
128
130 return scope_info()->HasContextExtensionSlot() && !IsUndefined(extension());
131}
132
134 DCHECK(scope_info()->HasContextExtensionSlot());
136}
137
139 return this->map()->native_context();
140}
141
143 return map()->instance_type() == FUNCTION_CONTEXT_TYPE;
144}
145
147 return map()->instance_type() == CATCH_CONTEXT_TYPE;
148}
149
151 return map()->instance_type() == WITH_CONTEXT_TYPE;
152}
153
155 return map()->instance_type() == DEBUG_EVALUATE_CONTEXT_TYPE;
156}
157
159 return map()->instance_type() == AWAIT_CONTEXT_TYPE;
160}
161
163 return map()->instance_type() == BLOCK_CONTEXT_TYPE;
164}
165
167 return map()->instance_type() == MODULE_CONTEXT_TYPE;
168}
169
171 return map()->instance_type() == EVAL_CONTEXT_TYPE;
172}
173
175 return map()->instance_type() == SCRIPT_CONTEXT_TYPE;
176}
177
179 return this->native_context()->security_token() ==
180 that->native_context()->security_token();
181}
182
183bool Context::IsDetached() const { return global_object()->IsDetached(); }
184
185#define NATIVE_CONTEXT_FIELD_ACCESSORS(index, type, name) \
186 void Context::set_##name(Tagged<UNPAREN(type)> value) { \
187 DCHECK(IsNativeContext(*this)); \
188 set(index, value, UPDATE_WRITE_BARRIER, kReleaseStore); \
189 } \
190 bool Context::is_##name(Tagged<UNPAREN(type)> value) const { \
191 DCHECK(IsNativeContext(*this)); \
192 return Cast<UNPAREN(type)>(get(index)) == value; \
193 } \
194 Tagged<UNPAREN(type)> Context::name() const { \
195 DCHECK(IsNativeContext(*this)); \
196 return Cast<UNPAREN(type)>(get(index)); \
197 } \
198 Tagged<UNPAREN(type)> Context::name(AcquireLoadTag tag) const { \
199 DCHECK(IsNativeContext(*this)); \
200 return Cast<UNPAREN(type)>(get(index, tag)); \
201 }
203#undef NATIVE_CONTEXT_FIELD_ACCESSORS
204
205#define CHECK_FOLLOWS2(v1, v2) static_assert((v1 + 1) == (v2))
206#define CHECK_FOLLOWS4(v1, v2, v3, v4) \
207 CHECK_FOLLOWS2(v1, v2); \
208 CHECK_FOLLOWS2(v2, v3); \
209 CHECK_FOLLOWS2(v3, v4)
210
212 bool has_shared_name) {
214 // Like the strict function map, but with no 'name' accessor. 'name'
215 // needs to be the last property and it is added during instantiation,
216 // in case a static property with the same name exists"
217 return CLASS_FUNCTION_MAP_INDEX;
218 }
219
220 int base = 0;
222 CHECK_FOLLOWS2(GENERATOR_FUNCTION_MAP_INDEX,
223 GENERATOR_FUNCTION_WITH_NAME_MAP_INDEX);
224 CHECK_FOLLOWS2(ASYNC_GENERATOR_FUNCTION_MAP_INDEX,
225 ASYNC_GENERATOR_FUNCTION_WITH_NAME_MAP_INDEX);
226
227 base = IsAsyncFunction(kind) ? ASYNC_GENERATOR_FUNCTION_MAP_INDEX
228 : GENERATOR_FUNCTION_MAP_INDEX;
229
231 CHECK_FOLLOWS2(ASYNC_FUNCTION_MAP_INDEX,
232 ASYNC_FUNCTION_WITH_NAME_MAP_INDEX);
233
234 base = ASYNC_FUNCTION_MAP_INDEX;
235
237 CHECK_FOLLOWS2(STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX,
238 METHOD_WITH_NAME_MAP_INDEX);
239
240 base = STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX;
241
242 } else {
243 CHECK_FOLLOWS2(SLOPPY_FUNCTION_MAP_INDEX,
244 SLOPPY_FUNCTION_WITH_NAME_MAP_INDEX);
245 CHECK_FOLLOWS2(STRICT_FUNCTION_MAP_INDEX,
246 STRICT_FUNCTION_WITH_NAME_MAP_INDEX);
247
248 base = is_strict(language_mode) ? STRICT_FUNCTION_MAP_INDEX
249 : SLOPPY_FUNCTION_MAP_INDEX;
250 }
251 int offset = static_cast<int>(!has_shared_name);
252 DCHECK_EQ(0, offset & ~1);
253
254 return base + offset;
255}
256
257#undef CHECK_FOLLOWS2
258#undef CHECK_FOLLOWS4
259
261 DCHECK(IsNativeContext(*this));
262 if (!IsFastElementsKind(kind)) return Map();
264 Tagged<Object> const initial_js_array_map = get(Context::ArrayMapIndex(kind));
265 DCHECK(!IsUndefined(initial_js_array_map));
266 return Cast<Map>(initial_js_array_map);
267}
268
270 kMicrotaskQueueOffset,
272
274 Tagged<ScriptContextTable> script_context_table) {
275 set(SCRIPT_CONTEXT_TABLE_INDEX, script_context_table, UPDATE_WRITE_BARRIER,
277}
278
284
286 ElementsKind element_kind) const {
287 int ctor_index = Context::FIRST_FIXED_TYPED_ARRAY_FUN_INDEX + element_kind -
289 Tagged<Map> map = Cast<Map>(Cast<JSFunction>(get(ctor_index))->initial_map());
290 DCHECK_EQ(map->elements_kind(), element_kind);
291 DCHECK(InstanceTypeChecker::IsJSTypedArray(map));
292 return map;
293}
294
296 ElementsKind element_kind) const {
298 element_kind -
300 Tagged<Map> map = Cast<Map>(get(ctor_index));
301 DCHECK_EQ(map->elements_kind(),
303 DCHECK(InstanceTypeChecker::IsJSTypedArray(map));
304 return map;
305}
306
308
309} // namespace internal
310} // namespace v8
311
313
314#endif // V8_OBJECTS_CONTEXTS_INL_H_
Builtins::Kind kind
Definition builtins.cc:40
bool IsModuleContext() const
bool IsDebugEvaluateContext() const
Tagged< Context > previous() const
bool has_extension() const
bool IsWithContext() const
V8_INLINE void set(int index, Tagged< Object > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
V8_EXPORT_PRIVATE Tagged< JSGlobalObject > global_object() const
Definition contexts.cc:188
bool IsBlockContext() const
static const int FIRST_FIXED_TYPED_ARRAY_FUN_INDEX
Definition contexts.h:573
static V8_INLINE constexpr int OffsetOfElementAt(int index)
Definition contexts.h:512
bool IsScriptContext() const
static const int FIRST_RAB_GSAB_TYPED_ARRAY_MAP_INDEX
Definition contexts.h:574
bool IsEvalContext() const
bool IsCatchContext() const
void set_previous(Tagged< Context > context, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
bool IsFunctionContext() const
Tagged< Map > GetInitialJSArrayMap(ElementsKind kind) const
Tagged< HeapObject > extension() const
bool IsAwaitContext() const
static int ArrayMapIndex(ElementsKind elements_kind)
Definition contexts.h:676
bool IsDetached() const
Tagged< Object > next_context_link() const
V8_INLINE Tagged< Object > get(int index) const
bool HasSameSecurityTokenAs(Tagged< Context > that) const
static int FunctionMapIndex(LanguageMode language_mode, FunctionKind kind, bool has_shared_name)
Tagged< NativeContext > native_context() const
Tagged< ScriptContextTable > synchronized_script_context_table() const
Tagged< Map > TypedArrayElementsKindToCtorMap(ElementsKind element_kind) const
Tagged< Map > TypedArrayElementsKindToRabGsabCtorMap(ElementsKind element_kind) const
void set(int index, Tagged< Object > value, WriteBarrierMode mode)=delete
void synchronized_set_script_context_table(Tagged< ScriptContextTable > script_context_table)
int length(AcquireLoadTag) const
Tagged< NameToIndexHashTable > names_to_context_index() const
void set_length(int value, ReleaseStoreTag)
Tagged< Context > get(int index) const
void set_names_to_context_index(Tagged< NameToIndexHashTable > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static constexpr Tagged< Smi > FromInt(int value)
Definition smi.h:38
static PtrType Relaxed_Load(Tagged< HeapObject > host, int offset=0)
#define NATIVE_CONTEXT_FIELD_ACCESSORS(index, type, name)
#define CHECK_FOLLOWS2(v1, v2)
#define NATIVE_CONTEXT_FIELDS(V)
Definition contexts.h:46
MicrotaskQueue * microtask_queue
Definition execution.cc:77
int32_t offset
std::map< const std::string, const std::string > map
ZoneVector< RpoNumber > & result
const int length_
Definition mul-fft.cc:473
@ UPDATE_WRITE_BARRIER
Definition objects.h:55
bool IsClassConstructor(FunctionKind kind)
bool IsGeneratorFunction(FunctionKind kind)
ElementsKind GetCorrespondingRabGsabElementsKind(ElementsKind typed_array_kind)
bool IsAsyncFunction(FunctionKind kind)
bool IsModuleWithTopLevelAwait(FunctionKind kind)
@ FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND
Handle< To > UncheckedCast(Handle< From > value)
Definition handles-inl.h:55
V8_INLINE PtrComprCageBase GetPtrComprCageBase()
bool IsFastElementsKind(ElementsKind kind)
bool is_strict(LanguageMode language_mode)
Definition globals.h:777
bool IsStrictFunctionWithoutPrototype(FunctionKind kind)
@ kNativeContextMicrotaskQueueTag
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
static constexpr ReleaseStoreTag kReleaseStore
Definition globals.h:2910
static constexpr RelaxedLoadTag kRelaxedLoad
Definition globals.h:2909
static constexpr AcquireLoadTag kAcquireLoad
Definition globals.h:2908
#define EXTERNAL_POINTER_ACCESSORS(holder, name, type, offset, tag)
#define OBJECT_CONSTRUCTORS_IMPL(Type, Super)
#define ACCESSORS(holder, name, type, offset)
#define TQ_OBJECT_CONSTRUCTORS_IMPL(Type)
#define CONDITIONAL_WRITE_BARRIER(object, offset, value, mode)
#define RELAXED_WRITE_FIELD(p, offset, value)
#define RELAXED_SMI_ACCESSORS(holder, name, offset)
#define NEVER_READ_ONLY_SPACE_IMPL(Type)
#define ACQUIRE_READ_FIELD(p, offset)
#define RELEASE_WRITE_FIELD(p, offset, value)
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_LT(v1, v2)
Definition logging.h:489
#define DCHECK_EQ(v1, v2)
Definition logging.h:485