mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-12-08 06:09:58 +00:00
LibJS: Do not assume cyclic modules have a cycle root
This is a normative change in the ECMA-262 spec. See:
939b993
This commit is contained in:
parent
1d4f431eb4
commit
a8514a2c29
Notes:
github-actions[bot]
2025-11-13 13:06:42 +00:00
Author: https://github.com/trflynn89
Commit: a8514a2c29
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/6809
Reviewed-by: https://github.com/gmta ✅
1 changed files with 12 additions and 12 deletions
|
|
@ -333,19 +333,19 @@ ThrowCompletionOr<GC::Ref<Promise>> CyclicModule::evaluate(VM& vm)
|
||||||
// 2. Assert: module.[[Status]] is one of linked, evaluating-async, or evaluated.
|
// 2. Assert: module.[[Status]] is one of linked, evaluating-async, or evaluated.
|
||||||
VERIFY(m_status == ModuleStatus::Linked || m_status == ModuleStatus::EvaluatingAsync || m_status == ModuleStatus::Evaluated);
|
VERIFY(m_status == ModuleStatus::Linked || m_status == ModuleStatus::EvaluatingAsync || m_status == ModuleStatus::Evaluated);
|
||||||
|
|
||||||
// NOTE: The spec does not catch the case where evaluate is called twice on a script which failed
|
// 3. If module.[[Status]] is either evaluating-async or evaluated, then
|
||||||
// during evaluation. This means the script is evaluated but does not have a cycle root.
|
|
||||||
// In that case we first check if this module itself has a top level capability.
|
|
||||||
// See also: https://github.com/tc39/ecma262/issues/2823 .
|
|
||||||
if (m_top_level_capability != nullptr)
|
|
||||||
return as<Promise>(*m_top_level_capability->promise());
|
|
||||||
|
|
||||||
// 3. If module.[[Status]] is either evaluating-async or evaluated, set module to module.[[CycleRoot]].
|
|
||||||
if ((m_status == ModuleStatus::EvaluatingAsync || m_status == ModuleStatus::Evaluated) && m_cycle_root != this) {
|
if ((m_status == ModuleStatus::EvaluatingAsync || m_status == ModuleStatus::Evaluated) && m_cycle_root != this) {
|
||||||
// Note: This will continue this function with module.[[CycleRoot]]
|
// a. If module.[[CycleRoot]] is not empty, then
|
||||||
VERIFY(m_cycle_root);
|
if (m_cycle_root) {
|
||||||
dbgln_if(JS_MODULE_DEBUG, "[JS MODULE] evaluate[{}](vm) deferring to cycle root at {}", this, m_cycle_root.ptr());
|
// i. Set module to module.[[CycleRoot]].
|
||||||
return m_cycle_root->evaluate(vm);
|
// NOTE: This will continue this function with module.[[CycleRoot]]
|
||||||
|
return m_cycle_root->evaluate(vm);
|
||||||
|
}
|
||||||
|
// b. Else,
|
||||||
|
else {
|
||||||
|
// i. Assert: module.[[Status]] is evaluated and module.[[EvaluationError]] is a throw completion.
|
||||||
|
VERIFY(m_status == ModuleStatus::Evaluated && m_evaluation_error.is_throw_completion());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. If module.[[TopLevelCapability]] is not empty, then
|
// 4. If module.[[TopLevelCapability]] is not empty, then
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue