v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
source-text-module.h
Go to the documentation of this file.
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#ifndef V8_OBJECTS_SOURCE_TEXT_MODULE_H_
6#define V8_OBJECTS_SOURCE_TEXT_MODULE_H_
7
10#include "src/objects/promise.h"
11#include "src/objects/string.h"
13#include "torque-generated/bit-fields.h"
14
15// Has to be the last include (doesn't have include guards):
17
18namespace v8 {
19namespace internal {
20
21class UnorderedModuleSet;
22class StructBodyDescriptor;
23
24#include "torque-generated/src/objects/source-text-module-tq.inc"
25
26// The runtime representation of an ECMAScript Source Text Module Record.
27// https://tc39.github.io/ecma262/#sec-source-text-module-records
29 : public TorqueGeneratedSourceTextModule<SourceTextModule, Module> {
30 public:
34
35 // The shared function info in case {status} is not kEvaluating, kEvaluated or
36 // kErrored.
38
40
41 // Whether or not this module contains a toplevel await. Set during module
42 // creation and does not change afterwards.
43 DECL_BOOLEAN_ACCESSORS(has_toplevel_await)
44
45 // Get the SourceTextModuleInfo associated with the code.
47
48 Tagged<Cell> GetCell(int cell_index);
49 static Handle<Object> LoadVariable(Isolate* isolate,
51 int cell_index);
53 int cell_index, DirectHandle<Object> value);
54
55 static int ImportIndex(int cell_index);
56 static int ExportIndex(int cell_index);
57
58 // Used by builtins to fulfill or reject the promise associated
59 // with async SourceTextModules. Return Nothing if the execution is
60 // terminated.
62 Isolate* isolate, Handle<SourceTextModule> module);
65 DirectHandle<Object> exception);
66
67 // Get the namespace object for [module_request] of [module]. If it doesn't
68 // exist yet, it is created.
71 int module_request);
72
73 // Get the import.meta object of [module]. If it doesn't exist yet, it is
74 // created and passed to the embedder callback for initialization.
77
81
82 static constexpr unsigned kFirstAsyncEvaluationOrdinal = 2;
83
88
90 std::pair<DirectHandleVector<SourceTextModule>,
93
94 private:
95 friend class Factory;
96 friend class Module;
97
101
102 // Appends a tuple of module and generator to the async parent modules
103 // ArrayList.
104 inline static void AddAsyncParentModule(
107
108 // Get the non-hole cycle root. Only valid when status >= kEvaluated.
109 inline Handle<SourceTextModule> GetCycleRoot(Isolate* isolate) const;
110
111 // Returns a SourceTextModule, the
112 // ith parent in depth first traversal order of a given async child.
114 int index);
115
116 // Returns the number of async parent modules for a given async child.
117 inline int AsyncParentModuleCount();
118
119 inline bool HasAsyncEvaluationOrdinal() const;
120
121 inline bool HasPendingAsyncDependencies();
124
125 // Bits for flags.
126 DEFINE_TORQUE_GENERATED_SOURCE_TEXT_MODULE_FLAGS()
127
128 // async_evaluation_ordinal, top_level_capability, pending_async_dependencies,
129 // and async_parent_modules are used exclusively during evaluation of async
130 // modules and the modules which depend on them.
131 //
132 // If >1, this module is async and evaluating or currently evaluating an async
133 // child. The integer is an ordinal for when this module first started async
134 // evaluation and is used for sorting async parent modules when determining
135 // which parent module can start executing after an async evaluation
136 // completes.
137 //
138 // If 1, this module has finished async evaluating.
139 //
140 // If 0, this module is not async or has not been async evaluated.
141 static constexpr unsigned kNotAsyncEvaluated = 0;
142 static constexpr unsigned kAsyncEvaluateDidFinish = 1;
146
147 // The parent modules of a given async dependency, use async_parent_modules()
148 // to retrieve the ArrayList representation.
149 DECL_ACCESSORS(async_parent_modules, Tagged<ArrayList>)
150
151 // Helpers for Instantiate and Evaluate.
152 static void CreateExport(Isolate* isolate,
154 int cell_index, DirectHandle<FixedArray> names);
155 static void CreateIndirectExport(
156 Isolate* isolate, DirectHandle<SourceTextModule> module,
158
160 Isolate* isolate, Handle<SourceTextModule> module,
161 DirectHandle<String> module_specifier, Handle<String> export_name,
162 MessageLocation loc, bool must_resolve, ResolveSet* resolve_set);
164 Isolate* isolate, DirectHandle<SourceTextModule> module,
165 Handle<String> name, int module_request_index, MessageLocation loc,
166 bool must_resolve, ResolveSet* resolve_set);
167
169 Isolate* isolate, DirectHandle<SourceTextModule> module,
170 DirectHandle<String> module_specifier, Handle<String> export_name,
171 MessageLocation loc, bool must_resolve, ResolveSet* resolve_set);
172
174 Isolate* isolate, DirectHandle<SourceTextModule> module,
175 v8::Local<v8::Context> context,
176 v8::Module::ResolveModuleCallback module_callback,
177 v8::Module::ResolveSourceCallback source_callback);
179 Isolate* isolate, Handle<SourceTextModule> module,
180 ZoneForwardList<Handle<SourceTextModule>>* stack, unsigned* dfs_index,
181 Zone* zone);
183 Isolate* isolate, DirectHandle<SourceTextModule> module);
184
185 static void FetchStarExports(Isolate* isolate,
186 Handle<SourceTextModule> module, Zone* zone,
187 UnorderedModuleSet* visited);
188
189 static void GatherAvailableAncestors(Isolate* isolate, Zone* zone,
191 AvailableAncestorsSet* exec_list);
192
193 // Implementation of spec concrete method Evaluate.
195 Isolate* isolate, Handle<SourceTextModule> module);
196
197 // Implementation of spec abstract operation InnerModuleEvaluation.
199 Isolate* isolate, Handle<SourceTextModule> module,
200 ZoneForwardList<Handle<SourceTextModule>>* stack, unsigned* dfs_index);
201
202 // Returns true if the evaluation exception was catchable by js, and false
203 // for termination exceptions.
206
208 Isolate* isolate, DirectHandle<SourceTextModule> module,
209 ZoneForwardList<Handle<SourceTextModule>>* stack, Status new_status);
210
211 // Implementation of spec ExecuteModule is broken up into
212 // InnerExecuteAsyncModule for asynchronous modules and ExecuteModule
213 // for synchronous modules.
217 DirectHandle<JSPromise> capability);
218
220 Isolate* isolate, DirectHandle<SourceTextModule> module,
222
223 // Implementation of spec ExecuteAsyncModule. Return Nothing if the execution
224 // is been terminated.
226 Isolate* isolate, DirectHandle<SourceTextModule> module);
227
228 static void Reset(Isolate* isolate, DirectHandle<SourceTextModule> module);
229
231 Isolate* isolate, UnorderedModuleSet* visited,
233
235};
236
237// SourceTextModuleInfo is to SourceTextModuleDescriptor what ScopeInfo is to
238// Scope.
240 public:
241 template <typename IsolateT>
243 IsolateT* isolate, Zone* zone, SourceTextModuleDescriptor* descr);
244
245 inline Tagged<FixedArray> module_requests() const;
246 inline Tagged<FixedArray> special_exports() const;
247 inline Tagged<FixedArray> regular_exports() const;
248 inline Tagged<FixedArray> regular_imports() const;
249 inline Tagged<FixedArray> namespace_imports() const;
250
251 // Accessors for [regular_exports].
252 int RegularExportCount() const;
253 Tagged<String> RegularExportLocalName(int i) const;
254 int RegularExportCellIndex(int i) const;
255 Tagged<FixedArray> RegularExportExportNames(int i) const;
256
257 inline bool Equals(Tagged<SourceTextModuleInfo> other) const;
258
259 private:
260 template <typename Impl>
261 friend class FactoryBase;
263 enum {
269 kLength
270 };
271 enum {
275 kRegularExportLength
276 };
277};
278
280 : public TorqueGeneratedModuleRequest<ModuleRequest, Struct> {
281 public:
284
285 template <typename IsolateT>
286 static Handle<ModuleRequest> New(IsolateT* isolate,
287 DirectHandle<String> specifier,
288 ModuleImportPhase phase,
289 DirectHandle<FixedArray> import_attributes,
290 int position);
291
292 // The number of entries in the import_attributes FixedArray that are used for
293 // a single attribute.
294 static const size_t kAttributeEntrySize = 3;
295
296 // Bits for flags.
297 DEFINE_TORQUE_GENERATED_MODULE_REQUEST_FLAGS()
298 static_assert(PositionBits::kMax >= String::kMaxLength,
299 "String::kMaxLength should fit in PositionBits::kMax");
301 inline void set_phase(ModuleImportPhase phase);
302 inline ModuleImportPhase phase() const;
303
305
307};
308
310 : public TorqueGeneratedSourceTextModuleInfoEntry<SourceTextModuleInfoEntry,
311 Struct> {
312 public:
314
315 template <typename IsolateT>
317 IsolateT* isolate, DirectHandle<UnionOf<String, Undefined>> export_name,
319 DirectHandle<UnionOf<String, Undefined>> import_name, int module_request,
320 int cell_index, int beg_pos, int end_pos);
321
323
325};
326
327} // namespace internal
328} // namespace v8
329
331
332#endif // V8_OBJECTS_SOURCE_TEXT_MODULE_H_
static NEVER_READ_ONLY_SPACE Handle< ModuleRequest > New(IsolateT *isolate, DirectHandle< String > specifier, ModuleImportPhase phase, DirectHandle< FixedArray > import_attributes, int position)
FixedBodyDescriptor< kExportsOffset, kHeaderSize, kHeaderSize > BodyDescriptor
Definition module.h:79
Tagged< Script > GetScript() const
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< Object > InnerExecuteAsyncModule(Isolate *isolate, DirectHandle< SourceTextModule > module, DirectHandle< JSPromise > capability)
static void CreateExport(Isolate *isolate, DirectHandle< SourceTextModule > module, int cell_index, DirectHandle< FixedArray > names)
static V8_WARN_UNUSED_RESULT bool MaybeTransitionComponent(Isolate *isolate, DirectHandle< SourceTextModule > module, ZoneForwardList< Handle< SourceTextModule > > *stack, Status new_status)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< Object > Evaluate(Isolate *isolate, Handle< SourceTextModule > module)
static void CreateIndirectExport(Isolate *isolate, DirectHandle< SourceTextModule > module, DirectHandle< String > name, DirectHandle< SourceTextModuleInfoEntry > entry)
static void AddAsyncParentModule(Isolate *isolate, DirectHandle< SourceTextModule > module, DirectHandle< SourceTextModule > parent)
Definition module-inl.h:126
Tagged< Cell > GetCell(int cell_index)
static constexpr unsigned kAsyncEvaluateDidFinish
static V8_WARN_UNUSED_RESULT MaybeHandle< Cell > ResolveExportUsingStarExports(Isolate *isolate, DirectHandle< SourceTextModule > module, DirectHandle< String > module_specifier, Handle< String > export_name, MessageLocation loc, bool must_resolve, ResolveSet *resolve_set)
static V8_EXPORT_PRIVATE MaybeHandle< JSObject > GetImportMeta(Isolate *isolate, DirectHandle< SourceTextModule > module)
V8_EXPORT_PRIVATE std::pair< DirectHandleVector< SourceTextModule >, DirectHandleVector< JSMessageObject > > GetStalledTopLevelAwaitMessages(Isolate *isolate)
static DirectHandle< JSModuleNamespace > GetModuleNamespace(Isolate *isolate, DirectHandle< SourceTextModule > module, int module_request)
static V8_WARN_UNUSED_RESULT bool RunInitializationCode(Isolate *isolate, DirectHandle< SourceTextModule > module)
Handle< SourceTextModule > GetAsyncParentModule(Isolate *isolate, int index)
Definition module-inl.h:136
static void FetchStarExports(Isolate *isolate, Handle< SourceTextModule > module, Zone *zone, UnorderedModuleSet *visited)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< Object > InnerModuleEvaluation(Isolate *isolate, Handle< SourceTextModule > module, ZoneForwardList< Handle< SourceTextModule > > *stack, unsigned *dfs_index)
static V8_WARN_UNUSED_RESULT Maybe< bool > ExecuteAsyncModule(Isolate *isolate, DirectHandle< SourceTextModule > module)
bool MaybeHandleEvaluationException(Isolate *isolate, ZoneForwardList< Handle< SourceTextModule > > *stack)
static constexpr unsigned kFirstAsyncEvaluationOrdinal
Handle< SourceTextModule > GetCycleRoot(Isolate *isolate) const
Definition module-inl.h:118
static V8_WARN_UNUSED_RESULT bool PrepareInstantiate(Isolate *isolate, DirectHandle< SourceTextModule > module, v8::Local< v8::Context > context, v8::Module::ResolveModuleCallback module_callback, v8::Module::ResolveSourceCallback source_callback)
bool HasAsyncEvaluationOrdinal() const
Definition module-inl.h:147
static void StoreVariable(DirectHandle< SourceTextModule > module, int cell_index, DirectHandle< Object > value)
static V8_WARN_UNUSED_RESULT MaybeHandle< Cell > ResolveExport(Isolate *isolate, Handle< SourceTextModule > module, DirectHandle< String > module_specifier, Handle< String > export_name, MessageLocation loc, bool must_resolve, ResolveSet *resolve_set)
static V8_WARN_UNUSED_RESULT bool FinishInstantiate(Isolate *isolate, Handle< SourceTextModule > module, ZoneForwardList< Handle< SourceTextModule > > *stack, unsigned *dfs_index, Zone *zone)
static V8_WARN_UNUSED_RESULT MaybeHandle< Cell > ResolveImport(Isolate *isolate, DirectHandle< SourceTextModule > module, Handle< String > name, int module_request_index, MessageLocation loc, bool must_resolve, ResolveSet *resolve_set)
V8_EXPORT_PRIVATE void InnerGetStalledTopLevelAwaitModule(Isolate *isolate, UnorderedModuleSet *visited, DirectHandleVector< SourceTextModule > *result)
static void Reset(Isolate *isolate, DirectHandle< SourceTextModule > module)
static void GatherAvailableAncestors(Isolate *isolate, Zone *zone, Handle< SourceTextModule > start, AvailableAncestorsSet *exec_list)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< Object > ExecuteModule(Isolate *isolate, DirectHandle< SourceTextModule > module, MaybeDirectHandle< Object > *exception_out)
static void AsyncModuleExecutionRejected(Isolate *isolate, DirectHandle< SourceTextModule > module, DirectHandle< Object > exception)
static Handle< Object > LoadVariable(Isolate *isolate, DirectHandle< SourceTextModule > module, int cell_index)
NEVER_READ_ONLY_SPACE Tagged< SharedFunctionInfo > GetSharedFunctionInfo() const
static int ImportIndex(int cell_index)
static Maybe< bool > AsyncModuleExecutionFulfilled(Isolate *isolate, Handle< SourceTextModule > module)
Tagged< SourceTextModuleInfo > info() const
Definition module-inl.h:60
static constexpr unsigned kNotAsyncEvaluated
static int ExportIndex(int cell_index)
int start
MaybeDirectHandle< Object > * exception_out
Definition execution.cc:80
ZoneVector< RpoNumber > & result
int position
Definition liveedit.cc:290
typename detail::FlattenUnionHelper< Union<>, Ts... >::type UnionOf
Definition union.h:123
ModuleImportPhase
#define DECL_ACCESSORS(name,...)
#define DECL_VERIFIER(Name)
#define DECL_BOOLEAN_ACCESSORS(name)
#define NEVER_READ_ONLY_SPACE
#define DECL_PRIMITIVE_ACCESSORS(name, type)
#define DECL_PRINTER(Name)
#define TQ_OBJECT_CONSTRUCTORS(Type)
#define V8_EXPORT_PRIVATE
Definition macros.h:460
#define V8_WARN_UNUSED_RESULT
Definition v8config.h:671