LibWeb: Push the realm execution context while linking modules

If linking fails, we throw a JS exception, and if there's no execution
context on the VM stack at that time, we assert in VM::current_realm().

This is a hack to prevent crashing on failed module loads. Long term we
need to rewrite module loading since it has been refactored to share
code differently between HTML and ECMA262.
This commit is contained in:
Andreas Kling 2023-05-18 19:08:30 +02:00
parent 819fb39a87
commit f823b297b4
Notes: sideshowbarker 2024-07-17 00:27:16 +09:00

View file

@ -601,7 +601,7 @@ void fetch_descendants_of_and_link_a_module_script(JavaScriptModuleScript& modul
// 1. Fetch the descendants of module script, given fetch client settings object, destination, visited set, and onFetchDescendantsComplete as defined below.
// If performFetch was given, pass it along as well.
// FIXME: Pass performFetch if given.
fetch_descendants_of_a_module_script(module_script, fetch_client_settings_object, destination, visited_set, [on_complete = move(on_complete)](auto result) {
fetch_descendants_of_a_module_script(module_script, fetch_client_settings_object, destination, visited_set, [&fetch_client_settings_object, on_complete = move(on_complete)](auto result) {
// onFetchDescendantsComplete given result is the following algorithm:
// 1. If result is null, then run onComplete given result, and abort these steps.
if (!result) {
@ -609,6 +609,10 @@ void fetch_descendants_of_and_link_a_module_script(JavaScriptModuleScript& modul
return;
}
// FIXME: This is an ad-hoc hack to make sure that there's an execution context on the VM stack in case linking throws an exception.
auto& vm = fetch_client_settings_object.vm();
vm.push_execution_context(fetch_client_settings_object.realm_execution_context());
// FIXME: 2. Let parse error be the result of finding the first parse error given result.
// 3. If parse error is null, then:
@ -628,6 +632,9 @@ void fetch_descendants_of_and_link_a_module_script(JavaScriptModuleScript& modul
TODO();
}
// FIXME: This undoes the ad-hoc hack above.
vm.pop_execution_context();
// 5. Run onComplete given result.
on_complete(result);
});