@@ -56,6 +56,7 @@ using v8::ObjectTemplate;
5656using v8::PrimitiveArray;
5757using v8::Promise;
5858using v8::PromiseRejectEvent;
59+ using v8::PropertyCallbackInfo;
5960using v8::ScriptCompiler;
6061using v8::ScriptOrigin;
6162using v8::String;
@@ -158,6 +159,8 @@ ModuleWrap::ModuleWrap(Realm* realm,
158159
159160 if (!synthetic_evaluation_step->IsUndefined ()) {
160161 synthetic_ = true ;
162+ // Synthetic modules have no dependencies.
163+ linked_ = true ;
161164 }
162165 MakeWeak ();
163166 module_.SetWeak ();
@@ -240,7 +243,7 @@ Maybe<bool> ModuleWrap::CheckUnsettledTopLevelAwait() {
240243 return Just (true );
241244 }
242245
243- if (!module -> IsGraphAsync ()) { // There is no TLA, no need to check.
246+ if (!HasAsyncGraph ()) { // There is no TLA, no need to check.
244247 return Just (true );
245248 }
246249
@@ -263,6 +266,16 @@ Maybe<bool> ModuleWrap::CheckUnsettledTopLevelAwait() {
263266 return Just (false );
264267}
265268
269+ bool ModuleWrap::HasAsyncGraph () {
270+ if (!has_async_graph_.has_value ()) {
271+ Isolate* isolate = env ()->isolate ();
272+ HandleScope scope (isolate);
273+
274+ has_async_graph_ = module_.Get (isolate)->IsGraphAsync ();
275+ }
276+ return has_async_graph_.value ();
277+ }
278+
266279Local<PrimitiveArray> ModuleWrap::GetHostDefinedOptions (
267280 Isolate* isolate, Local<Symbol> id_symbol) {
268281 Local<PrimitiveArray> host_defined_options =
@@ -680,25 +693,28 @@ void ModuleWrap::Instantiate(const FunctionCallbackInfo<Value>& args) {
680693 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
681694 Local<Context> context = obj->context ();
682695 Local<Module> module = obj->module_ .Get (isolate);
696+ Environment* env = realm->env ();
683697
684698 if (!obj->IsLinked ()) {
685- THROW_ERR_VM_MODULE_LINK_FAILURE (realm-> env () , " module is not linked" );
699+ THROW_ERR_VM_MODULE_LINK_FAILURE (env, " module is not linked" );
686700 return ;
687701 }
688702
689- TryCatchScope try_catch (realm->env ());
690- USE (module ->InstantiateModule (
691- context, ResolveModuleCallback, ResolveSourceCallback));
703+ {
704+ TryCatchScope try_catch (env);
705+ USE (module ->InstantiateModule (
706+ context, ResolveModuleCallback, ResolveSourceCallback));
692707
693- if (try_catch.HasCaught () && !try_catch.HasTerminated ()) {
694- CHECK (!try_catch.Message ().IsEmpty ());
695- CHECK (!try_catch.Exception ().IsEmpty ());
696- AppendExceptionLine (realm->env (),
697- try_catch.Exception (),
698- try_catch.Message (),
699- ErrorHandlingMode::MODULE_ERROR);
700- try_catch.ReThrow ();
701- return ;
708+ if (try_catch.HasCaught () && !try_catch.HasTerminated ()) {
709+ CHECK (!try_catch.Message ().IsEmpty ());
710+ CHECK (!try_catch.Exception ().IsEmpty ());
711+ AppendExceptionLine (env,
712+ try_catch.Exception (),
713+ try_catch.Message (),
714+ ErrorHandlingMode::MODULE_ERROR);
715+ try_catch.ReThrow ();
716+ return ;
717+ }
702718 }
703719}
704720
@@ -783,37 +799,6 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo<Value>& args) {
783799 }
784800}
785801
786- void ModuleWrap::InstantiateSync (const FunctionCallbackInfo<Value>& args) {
787- Realm* realm = Realm::GetCurrent (args);
788- Isolate* isolate = args.GetIsolate ();
789- ModuleWrap* obj;
790- ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
791- Local<Context> context = obj->context ();
792- Local<Module> module = obj->module_ .Get (isolate);
793- Environment* env = realm->env ();
794-
795- {
796- TryCatchScope try_catch (env);
797- USE (module ->InstantiateModule (
798- context, ResolveModuleCallback, ResolveSourceCallback));
799-
800- if (try_catch.HasCaught () && !try_catch.HasTerminated ()) {
801- CHECK (!try_catch.Message ().IsEmpty ());
802- CHECK (!try_catch.Exception ().IsEmpty ());
803- AppendExceptionLine (env,
804- try_catch.Exception (),
805- try_catch.Message (),
806- ErrorHandlingMode::MODULE_ERROR);
807- try_catch.ReThrow ();
808- return ;
809- }
810- }
811-
812- // TODO(joyeecheung): record Module::HasTopLevelAwait() in every ModuleWrap
813- // and infer the asynchronicity from a module's children during linking.
814- args.GetReturnValue ().Set (module ->IsGraphAsync ());
815- }
816-
817802Maybe<void > ThrowIfPromiseRejected (Realm* realm, Local<Promise> promise) {
818803 Isolate* isolate = realm->isolate ();
819804 Local<Context> context = realm->context ();
@@ -879,7 +864,7 @@ void ModuleWrap::EvaluateSync(const FunctionCallbackInfo<Value>& args) {
879864 return ;
880865 }
881866
882- if (module -> IsGraphAsync ()) {
867+ if (obj-> HasAsyncGraph ()) {
883868 CHECK (env->options ()->print_required_tla );
884869 auto stalled_messages =
885870 std::get<1 >(module ->GetStalledTopLevelAwaitMessages (isolate));
@@ -901,52 +886,15 @@ void ModuleWrap::EvaluateSync(const FunctionCallbackInfo<Value>& args) {
901886 args.GetReturnValue ().Set (module ->GetModuleNamespace ());
902887}
903888
904- void ModuleWrap::GetNamespaceSync (const FunctionCallbackInfo<Value>& args) {
905- Realm* realm = Realm::GetCurrent (args);
906- Isolate* isolate = args.GetIsolate ();
907- ModuleWrap* obj;
908- ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
909- Local<Module> module = obj->module_ .Get (isolate);
910-
911- switch (module ->GetStatus ()) {
912- case Module::Status::kUninstantiated :
913- case Module::Status::kInstantiating :
914- return realm->env ()->ThrowError (
915- " Cannot get namespace, module has not been instantiated" );
916- case Module::Status::kInstantiated :
917- case Module::Status::kEvaluating :
918- case Module::Status::kEvaluated :
919- case Module::Status::kErrored :
920- break ;
921- }
922-
923- if (module ->IsGraphAsync ()) {
924- return THROW_ERR_REQUIRE_ASYNC_MODULE (realm->env (), args[0 ], args[1 ]);
925- }
926- Local<Value> result = module ->GetModuleNamespace ();
927- args.GetReturnValue ().Set (result);
928- }
929-
930889void ModuleWrap::GetNamespace (const FunctionCallbackInfo<Value>& args) {
931890 Realm* realm = Realm::GetCurrent (args);
932891 Isolate* isolate = args.GetIsolate ();
933892 ModuleWrap* obj;
934893 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
935894
936895 Local<Module> module = obj->module_ .Get (isolate);
937-
938- switch (module ->GetStatus ()) {
939- case Module::Status::kUninstantiated :
940- case Module::Status::kInstantiating :
941- return realm->env ()->ThrowError (
942- " cannot get namespace, module has not been instantiated" );
943- case Module::Status::kInstantiated :
944- case Module::Status::kEvaluating :
945- case Module::Status::kEvaluated :
946- case Module::Status::kErrored :
947- break ;
948- default :
949- UNREACHABLE ();
896+ if (module ->GetStatus () < Module::kInstantiated ) {
897+ return THROW_ERR_MODULE_NOT_INSTANTIATED (realm->env ());
950898 }
951899
952900 Local<Value> result = module ->GetModuleNamespace ();
@@ -997,23 +945,28 @@ void ModuleWrap::GetStatus(const FunctionCallbackInfo<Value>& args) {
997945 args.GetReturnValue ().Set (module ->GetStatus ());
998946}
999947
1000- void ModuleWrap::IsGraphAsync (const FunctionCallbackInfo<Value>& args) {
948+ void ModuleWrap::GetError (const FunctionCallbackInfo<Value>& args) {
1001949 Isolate* isolate = args.GetIsolate ();
1002950 ModuleWrap* obj;
1003951 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
1004952
1005953 Local<Module> module = obj->module_ .Get (isolate);
1006-
1007- args.GetReturnValue ().Set (module ->IsGraphAsync ());
954+ args.GetReturnValue ().Set (module ->GetException ());
1008955}
1009956
1010- void ModuleWrap::GetError (const FunctionCallbackInfo<Value>& args) {
957+ void ModuleWrap::HasAsyncGraph (Local<Name> property,
958+ const PropertyCallbackInfo<Value>& args) {
1011959 Isolate* isolate = args.GetIsolate ();
960+ Environment* env = Environment::GetCurrent (isolate);
1012961 ModuleWrap* obj;
1013962 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
1014963
1015964 Local<Module> module = obj->module_ .Get (isolate);
1016- args.GetReturnValue ().Set (module ->GetException ());
965+ if (module ->GetStatus () < Module::kInstantiated ) {
966+ return THROW_ERR_MODULE_NOT_INSTANTIATED (env);
967+ }
968+
969+ args.GetReturnValue ().Set (obj->HasAsyncGraph ());
1017970}
1018971
1019972// static
@@ -1417,10 +1370,8 @@ void ModuleWrap::CreatePerIsolateProperties(IsolateData* isolate_data,
14171370
14181371 SetProtoMethod (isolate, tpl, " link" , Link);
14191372 SetProtoMethod (isolate, tpl, " getModuleRequests" , GetModuleRequests);
1420- SetProtoMethod (isolate, tpl, " instantiateSync" , InstantiateSync);
1421- SetProtoMethod (isolate, tpl, " evaluateSync" , EvaluateSync);
1422- SetProtoMethod (isolate, tpl, " getNamespaceSync" , GetNamespaceSync);
14231373 SetProtoMethod (isolate, tpl, " instantiate" , Instantiate);
1374+ SetProtoMethod (isolate, tpl, " evaluateSync" , EvaluateSync);
14241375 SetProtoMethod (isolate, tpl, " evaluate" , Evaluate);
14251376 SetProtoMethod (isolate, tpl, " setExport" , SetSyntheticExport);
14261377 SetProtoMethod (isolate, tpl, " setModuleSourceObject" , SetModuleSourceObject);
@@ -1429,9 +1380,12 @@ void ModuleWrap::CreatePerIsolateProperties(IsolateData* isolate_data,
14291380 isolate, tpl, " createCachedData" , CreateCachedData);
14301381 SetProtoMethodNoSideEffect (isolate, tpl, " getNamespace" , GetNamespace);
14311382 SetProtoMethodNoSideEffect (isolate, tpl, " getStatus" , GetStatus);
1432- SetProtoMethodNoSideEffect (isolate, tpl, " isGraphAsync" , IsGraphAsync);
14331383 SetProtoMethodNoSideEffect (isolate, tpl, " getError" , GetError);
14341384 SetConstructorFunction (isolate, target, " ModuleWrap" , tpl);
1385+
1386+ tpl->InstanceTemplate ()->SetLazyDataProperty (
1387+ FIXED_ONE_BYTE_STRING (isolate, " hasAsyncGraph" ), HasAsyncGraph);
1388+
14351389 isolate_data->set_module_wrap_constructor_template (tpl);
14361390
14371391 SetMethod (isolate,
@@ -1479,9 +1433,7 @@ void ModuleWrap::RegisterExternalReferences(
14791433
14801434 registry->Register (Link);
14811435 registry->Register (GetModuleRequests);
1482- registry->Register (InstantiateSync);
14831436 registry->Register (EvaluateSync);
1484- registry->Register (GetNamespaceSync);
14851437 registry->Register (Instantiate);
14861438 registry->Register (Evaluate);
14871439 registry->Register (SetSyntheticExport);
@@ -1491,7 +1443,7 @@ void ModuleWrap::RegisterExternalReferences(
14911443 registry->Register (GetNamespace);
14921444 registry->Register (GetStatus);
14931445 registry->Register (GetError);
1494- registry->Register (IsGraphAsync );
1446+ registry->Register (HasAsyncGraph );
14951447
14961448 registry->Register (CreateRequiredModuleFacade);
14971449
0 commit comments