@@ -1580,38 +1580,54 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
1580
1580
const iso = self .isolate ;
1581
1581
const ctx = self .v8_context ;
1582
1582
1583
- const module_loader = self .module_loader ;
1584
- const source = module_loader .func (module_loader .ptr , specifier ) catch {
1585
- const error_msg = v8 .String .initUtf8 (iso , "Failed to load module" );
1586
- _ = resolver .reject (ctx , error_msg .toValue ());
1587
- return ;
1588
- } orelse {
1589
- const error_msg = v8 .String .initUtf8 (iso , "Module source not available" );
1590
- _ = resolver .reject (ctx , error_msg .toValue ());
1591
- return ;
1592
- };
1583
+ if (self .module_cache .get (specifier )) | cached_module | {
1584
+ const new_module = cached_module .castToModule ();
1585
+ const status = new_module .getStatus ();
1586
+
1587
+ switch (status ) {
1588
+ .kEvaluated , .kEvaluating = > {
1589
+ const namespace = new_module .getModuleNamespace ();
1590
+ log .info (.js , "dynamic import complete" , .{
1591
+ .specifier = specifier ,
1592
+ });
1593
+ _ = resolver .resolve (ctx , namespace );
1594
+ return ;
1595
+ },
1596
+ else = > {},
1597
+ }
1598
+ } else {
1599
+ const module_loader = self .module_loader ;
1600
+ const source = module_loader .func (module_loader .ptr , specifier ) catch {
1601
+ const error_msg = v8 .String .initUtf8 (iso , "Failed to load module" );
1602
+ _ = resolver .reject (ctx , error_msg .toValue ());
1603
+ return ;
1604
+ } orelse {
1605
+ const error_msg = v8 .String .initUtf8 (iso , "Module source not available" );
1606
+ _ = resolver .reject (ctx , error_msg .toValue ());
1607
+ return ;
1608
+ };
1593
1609
1594
- var try_catch : TryCatch = undefined ;
1595
- try_catch .init (self );
1596
- defer try_catch .deinit ();
1610
+ var try_catch : TryCatch = undefined ;
1611
+ try_catch .init (self );
1612
+ defer try_catch .deinit ();
1597
1613
1598
- const maybe_promise = self .module (source , specifier , true ) catch {
1599
- log .err (.js , "module compilation failed" , .{
1600
- .specifier = specifier ,
1601
- .exception = try_catch .exception (self .call_arena ) catch "unknown error" ,
1602
- .stack = try_catch .stack (self .call_arena ) catch null ,
1603
- .line = try_catch .sourceLineNumber () orelse 0 ,
1604
- });
1605
- const error_msg = if (try_catch .hasCaught ()) blk : {
1606
- const exception_str = try_catch .exception (self .call_arena ) catch "Evaluation error" ;
1607
- break :blk v8 .String .initUtf8 (iso , exception_str orelse "Evaluation error" );
1608
- } else v8 .String .initUtf8 (iso , "Module evaluation failed" );
1609
- _ = resolver .reject (ctx , error_msg .toValue ());
1610
- return ;
1611
- };
1612
- const new_module = self .module_cache .get (specifier ).? .castToModule ();
1614
+ const promise = self .module (source , specifier , true ) catch {
1615
+ log .err (.js , "module compilation failed" , .{
1616
+ .specifier = specifier ,
1617
+ .exception = try_catch .exception (self .call_arena ) catch "unknown error" ,
1618
+ .stack = try_catch .stack (self .call_arena ) catch null ,
1619
+ .line = try_catch .sourceLineNumber () orelse 0 ,
1620
+ });
1621
+ const error_msg = if (try_catch .hasCaught ()) blk : {
1622
+ const exception_str = try_catch .exception (self .call_arena ) catch "Evaluation error" ;
1623
+ break :blk v8 .String .initUtf8 (iso , exception_str orelse "Evaluation error" );
1624
+ } else v8 .String .initUtf8 (iso , "Module evaluation failed" );
1625
+ _ = resolver .reject (ctx , error_msg .toValue ());
1626
+ return ;
1627
+ } orelse unreachable ;
1628
+
1629
+ const new_module = self .module_cache .get (specifier ).? .castToModule ();
1613
1630
1614
- if (maybe_promise ) | promise | {
1615
1631
// This means we must wait for the evaluation.
1616
1632
const EvaluationData = struct {
1617
1633
specifier : []const u8 ,
@@ -1663,15 +1679,6 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
1663
1679
_ = resolver .reject (ctx , error_msg .toValue ());
1664
1680
return ;
1665
1681
};
1666
- } else {
1667
- // This means it is already present in the cache.
1668
- const namespace = new_module .getModuleNamespace ();
1669
- log .info (.js , "dynamic import complete" , .{
1670
- .module = new_module ,
1671
- .namespace = namespace ,
1672
- });
1673
- _ = resolver .resolve (ctx , namespace );
1674
- return ;
1675
1682
}
1676
1683
}
1677
1684
};
0 commit comments