@@ -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 =
@@ -687,25 +700,28 @@ void ModuleWrap::Instantiate(const FunctionCallbackInfo<Value>& args) {
687700 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
688701 Local<Context> context = obj->context ();
689702 Local<Module> module  = obj->module_ .Get (isolate);
703+  Environment* env = realm->env ();
690704
691705 if  (!obj->IsLinked ()) {
692-  THROW_ERR_VM_MODULE_LINK_FAILURE (realm-> env () , " module is not linked" 
706+  THROW_ERR_VM_MODULE_LINK_FAILURE (env, " module is not linked" 
693707 return ;
694708 }
695709
696-  TryCatchScope try_catch (realm->env ());
697-  USE (module ->InstantiateModule (
698-  context, ResolveModuleCallback, ResolveSourceCallback));
710+  {
711+  TryCatchScope try_catch (env);
712+  USE (module ->InstantiateModule (
713+  context, ResolveModuleCallback, ResolveSourceCallback));
699714
700-  if  (try_catch.HasCaught () && !try_catch.HasTerminated ()) {
701-  CHECK (!try_catch.Message ().IsEmpty ());
702-  CHECK (!try_catch.Exception ().IsEmpty ());
703-  AppendExceptionLine (realm->env (),
704-  try_catch.Exception (),
705-  try_catch.Message (),
706-  ErrorHandlingMode::MODULE_ERROR);
707-  try_catch.ReThrow ();
708-  return ;
715+  if  (try_catch.HasCaught () && !try_catch.HasTerminated ()) {
716+  CHECK (!try_catch.Message ().IsEmpty ());
717+  CHECK (!try_catch.Exception ().IsEmpty ());
718+  AppendExceptionLine (env,
719+  try_catch.Exception (),
720+  try_catch.Message (),
721+  ErrorHandlingMode::MODULE_ERROR);
722+  try_catch.ReThrow ();
723+  return ;
724+  }
709725 }
710726}
711727
@@ -790,37 +806,6 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo<Value>& args) {
790806 }
791807}
792808
793- void  ModuleWrap::InstantiateSync (const  FunctionCallbackInfo<Value>& args) {
794-  Realm* realm = Realm::GetCurrent (args);
795-  Isolate* isolate = args.GetIsolate ();
796-  ModuleWrap* obj;
797-  ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
798-  Local<Context> context = obj->context ();
799-  Local<Module> module  = obj->module_ .Get (isolate);
800-  Environment* env = realm->env ();
801- 
802-  {
803-  TryCatchScope try_catch (env);
804-  USE (module ->InstantiateModule (
805-  context, ResolveModuleCallback, ResolveSourceCallback));
806- 
807-  if  (try_catch.HasCaught () && !try_catch.HasTerminated ()) {
808-  CHECK (!try_catch.Message ().IsEmpty ());
809-  CHECK (!try_catch.Exception ().IsEmpty ());
810-  AppendExceptionLine (env,
811-  try_catch.Exception (),
812-  try_catch.Message (),
813-  ErrorHandlingMode::MODULE_ERROR);
814-  try_catch.ReThrow ();
815-  return ;
816-  }
817-  }
818- 
819-  //  TODO(joyeecheung): record Module::HasTopLevelAwait() in every ModuleWrap
820-  //  and infer the asynchronicity from a module's children during linking.
821-  args.GetReturnValue ().Set (module ->IsGraphAsync ());
822- }
823- 
824809Maybe<void > ThrowIfPromiseRejected (Realm* realm, Local<Promise> promise) {
825810 Isolate* isolate = realm->isolate ();
826811 Local<Context> context = realm->context ();
@@ -886,7 +871,7 @@ void ModuleWrap::EvaluateSync(const FunctionCallbackInfo<Value>& args) {
886871 return ;
887872 }
888873
889-  if  (module -> IsGraphAsync ()) {
874+  if  (obj-> HasAsyncGraph ()) {
890875 CHECK (env->options ()->print_required_tla );
891876 auto  stalled_messages =
892877 std::get<1 >(module ->GetStalledTopLevelAwaitMessages (isolate));
@@ -908,52 +893,15 @@ void ModuleWrap::EvaluateSync(const FunctionCallbackInfo<Value>& args) {
908893 args.GetReturnValue ().Set (module ->GetModuleNamespace ());
909894}
910895
911- void  ModuleWrap::GetNamespaceSync (const  FunctionCallbackInfo<Value>& args) {
912-  Realm* realm = Realm::GetCurrent (args);
913-  Isolate* isolate = args.GetIsolate ();
914-  ModuleWrap* obj;
915-  ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
916-  Local<Module> module  = obj->module_ .Get (isolate);
917- 
918-  switch  (module ->GetStatus ()) {
919-  case  Module::Status::kUninstantiated :
920-  case  Module::Status::kInstantiating :
921-  return  realm->env ()->ThrowError (
922-  " Cannot get namespace, module has not been instantiated" 
923-  case  Module::Status::kInstantiated :
924-  case  Module::Status::kEvaluating :
925-  case  Module::Status::kEvaluated :
926-  case  Module::Status::kErrored :
927-  break ;
928-  }
929- 
930-  if  (module ->IsGraphAsync ()) {
931-  return  THROW_ERR_REQUIRE_ASYNC_MODULE (realm->env (), args[0 ], args[1 ]);
932-  }
933-  Local<Value> result = module ->GetModuleNamespace ();
934-  args.GetReturnValue ().Set (result);
935- }
936- 
937896void  ModuleWrap::GetNamespace (const  FunctionCallbackInfo<Value>& args) {
938897 Realm* realm = Realm::GetCurrent (args);
939898 Isolate* isolate = args.GetIsolate ();
940899 ModuleWrap* obj;
941900 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
942901
943902 Local<Module> module  = obj->module_ .Get (isolate);
944- 
945-  switch  (module ->GetStatus ()) {
946-  case  Module::Status::kUninstantiated :
947-  case  Module::Status::kInstantiating :
948-  return  realm->env ()->ThrowError (
949-  " cannot get namespace, module has not been instantiated" 
950-  case  Module::Status::kInstantiated :
951-  case  Module::Status::kEvaluating :
952-  case  Module::Status::kEvaluated :
953-  case  Module::Status::kErrored :
954-  break ;
955-  default :
956-  UNREACHABLE ();
903+  if  (module ->GetStatus () < Module::kInstantiated ) {
904+  return  THROW_ERR_MODULE_NOT_INSTANTIATED (realm->env ());
957905 }
958906
959907 Local<Value> result = module ->GetModuleNamespace ();
@@ -1004,23 +952,28 @@ void ModuleWrap::GetStatus(const FunctionCallbackInfo<Value>& args) {
1004952 args.GetReturnValue ().Set (module ->GetStatus ());
1005953}
1006954
1007- void  ModuleWrap::IsGraphAsync  (const  FunctionCallbackInfo<Value>& args) {
955+ void  ModuleWrap::GetError  (const  FunctionCallbackInfo<Value>& args) {
1008956 Isolate* isolate = args.GetIsolate ();
1009957 ModuleWrap* obj;
1010958 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
1011959
1012960 Local<Module> module  = obj->module_ .Get (isolate);
1013- 
1014-  args.GetReturnValue ().Set (module ->IsGraphAsync ());
961+  args.GetReturnValue ().Set (module ->GetException ());
1015962}
1016963
1017- void  ModuleWrap::GetError (const  FunctionCallbackInfo<Value>& args) {
964+ void  ModuleWrap::HasAsyncGraph (Local<Name> property,
965+  const  PropertyCallbackInfo<Value>& args) {
1018966 Isolate* isolate = args.GetIsolate ();
967+  Environment* env = Environment::GetCurrent (isolate);
1019968 ModuleWrap* obj;
1020969 ASSIGN_OR_RETURN_UNWRAP (&obj, args.This ());
1021970
1022971 Local<Module> module  = obj->module_ .Get (isolate);
1023-  args.GetReturnValue ().Set (module ->GetException ());
972+  if  (module ->GetStatus () < Module::kInstantiated ) {
973+  return  THROW_ERR_MODULE_NOT_INSTANTIATED (env);
974+  }
975+ 
976+  args.GetReturnValue ().Set (obj->HasAsyncGraph ());
1024977}
1025978
1026979//  static
@@ -1424,10 +1377,8 @@ void ModuleWrap::CreatePerIsolateProperties(IsolateData* isolate_data,
14241377
14251378 SetProtoMethod (isolate, tpl, " link" 
14261379 SetProtoMethod (isolate, tpl, " getModuleRequests" 
1427-  SetProtoMethod (isolate, tpl, " instantiateSync" 
1428-  SetProtoMethod (isolate, tpl, " evaluateSync" 
1429-  SetProtoMethod (isolate, tpl, " getNamespaceSync" 
14301380 SetProtoMethod (isolate, tpl, " instantiate" 
1381+  SetProtoMethod (isolate, tpl, " evaluateSync" 
14311382 SetProtoMethod (isolate, tpl, " evaluate" 
14321383 SetProtoMethod (isolate, tpl, " setExport" 
14331384 SetProtoMethod (isolate, tpl, " setModuleSourceObject" 
@@ -1436,9 +1387,12 @@ void ModuleWrap::CreatePerIsolateProperties(IsolateData* isolate_data,
14361387 isolate, tpl, " createCachedData" 
14371388 SetProtoMethodNoSideEffect (isolate, tpl, " getNamespace" 
14381389 SetProtoMethodNoSideEffect (isolate, tpl, " getStatus" 
1439-  SetProtoMethodNoSideEffect (isolate, tpl, " isGraphAsync" 
14401390 SetProtoMethodNoSideEffect (isolate, tpl, " getError" 
14411391 SetConstructorFunction (isolate, target, " ModuleWrap" 
1392+ 
1393+  tpl->InstanceTemplate ()->SetLazyDataProperty (
1394+  FIXED_ONE_BYTE_STRING (isolate, " hasAsyncGraph" 
1395+ 
14421396 isolate_data->set_module_wrap_constructor_template (tpl);
14431397
14441398 SetMethod (isolate,
@@ -1486,9 +1440,7 @@ void ModuleWrap::RegisterExternalReferences(
14861440
14871441 registry->Register (Link);
14881442 registry->Register (GetModuleRequests);
1489-  registry->Register (InstantiateSync);
14901443 registry->Register (EvaluateSync);
1491-  registry->Register (GetNamespaceSync);
14921444 registry->Register (Instantiate);
14931445 registry->Register (Evaluate);
14941446 registry->Register (SetSyntheticExport);
@@ -1498,7 +1450,7 @@ void ModuleWrap::RegisterExternalReferences(
14981450 registry->Register (GetNamespace);
14991451 registry->Register (GetStatus);
15001452 registry->Register (GetError);
1501-  registry->Register (IsGraphAsync );
1453+  registry->Register (HasAsyncGraph );
15021454
15031455 registry->Register (CreateRequiredModuleFacade);
15041456
0 commit comments