@@ -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 =
@@ -673,35 +686,6 @@ void ModuleWrap::Link(const FunctionCallbackInfo<Value>& args) {
673686 dependent->linked_ = true ;
674687}
675688
676- void ModuleWrap::Instantiate (const FunctionCallbackInfo<Value>& args) {
677- Realm* realm = Realm::GetCurrent (args);
678- Isolate* isolate = args.GetIsolate ();
679- ModuleWrap* obj;
680- ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
681- Local<Context> context = obj->context ();
682- Local<Module> module = obj->module_ .Get (isolate);
683-
684- if (!obj->IsLinked ()) {
685- THROW_ERR_VM_MODULE_LINK_FAILURE (realm->env (), " module is not linked" );
686- return ;
687- }
688-
689- TryCatchScope try_catch (realm->env ());
690- USE (module ->InstantiateModule (
691- context, ResolveModuleCallback, ResolveSourceCallback));
692-
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 ;
702- }
703- }
704-
705689void ModuleWrap::Evaluate (const FunctionCallbackInfo<Value>& args) {
706690 Realm* realm = Realm::GetCurrent (args);
707691 Isolate* isolate = realm->isolate ();
@@ -783,7 +767,7 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo<Value>& args) {
783767 }
784768}
785769
786- void ModuleWrap::InstantiateSync (const FunctionCallbackInfo<Value>& args) {
770+ void ModuleWrap::Instantiate (const FunctionCallbackInfo<Value>& args) {
787771 Realm* realm = Realm::GetCurrent (args);
788772 Isolate* isolate = args.GetIsolate ();
789773 ModuleWrap* obj;
@@ -792,6 +776,11 @@ void ModuleWrap::InstantiateSync(const FunctionCallbackInfo<Value>& args) {
792776 Local<Module> module = obj->module_ .Get (isolate);
793777 Environment* env = realm->env ();
794778
779+ if (!obj->IsLinked ()) {
780+ THROW_ERR_VM_MODULE_LINK_FAILURE (env, " module is not linked" );
781+ return ;
782+ }
783+
795784 {
796785 TryCatchScope try_catch (env);
797786 USE (module ->InstantiateModule (
@@ -808,10 +797,6 @@ void ModuleWrap::InstantiateSync(const FunctionCallbackInfo<Value>& args) {
808797 return ;
809798 }
810799 }
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 ());
815800}
816801
817802Maybe<void > ThrowIfPromiseRejected (Realm* realm, Local<Promise> promise) {
@@ -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,9 +1370,7 @@ 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);
14211373 SetProtoMethod (isolate, tpl, " evaluateSync" , EvaluateSync);
1422- SetProtoMethod (isolate, tpl, " getNamespaceSync" , GetNamespaceSync);
14231374 SetProtoMethod (isolate, tpl, " instantiate" , Instantiate);
14241375 SetProtoMethod (isolate, tpl, " evaluate" , Evaluate);
14251376 SetProtoMethod (isolate, tpl, " setExport" , SetSyntheticExport);
@@ -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