1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 09:38:11 +00:00

LibJS: Make ScriptOrModule use WeakPtr instead of raw pointers

This commit is contained in:
Andreas Kling 2022-02-07 16:28:39 +01:00
parent 6ee597369d
commit 85cf80507f
9 changed files with 23 additions and 18 deletions

View file

@ -3175,9 +3175,10 @@ Completion MetaProperty::execute(Interpreter& interpreter, GlobalObject& global_
auto script_or_module = interpreter.vm().get_active_script_or_module(); auto script_or_module = interpreter.vm().get_active_script_or_module();
// 2. Assert: module is a Source Text Module Record. // 2. Assert: module is a Source Text Module Record.
VERIFY(script_or_module.has<Module*>()); VERIFY(script_or_module.has<WeakPtr<Module>>());
VERIFY(is<SourceTextModule>(*script_or_module.get<Module*>())); VERIFY(script_or_module.get<WeakPtr<Module>>());
auto& module = static_cast<SourceTextModule&>(*script_or_module.get<Module*>()); VERIFY(is<SourceTextModule>(*script_or_module.get<WeakPtr<Module>>()));
auto& module = static_cast<SourceTextModule&>(*script_or_module.get<WeakPtr<Module>>());
// 3. Let importMeta be module.[[ImportMeta]]. // 3. Let importMeta be module.[[ImportMeta]].
auto* import_meta = module.import_meta(); auto* import_meta = module.import_meta();

View file

@ -107,7 +107,7 @@ ThrowCompletionOr<u32> CyclicModule::inner_module_linking(VM& vm, Vector<Module*
ModuleRequest required { required_string }; ModuleRequest required { required_string };
// a. Let requiredModule be ? HostResolveImportedModule(module, required). // a. Let requiredModule be ? HostResolveImportedModule(module, required).
auto required_module = TRY(vm.host_resolve_imported_module(this, required)); auto required_module = TRY(vm.host_resolve_imported_module(this->make_weak_ptr(), required));
// b. Set index to ? InnerModuleLinking(requiredModule, stack, index). // b. Set index to ? InnerModuleLinking(requiredModule, stack, index).
index = TRY(required_module->inner_module_linking(vm, stack, index)); index = TRY(required_module->inner_module_linking(vm, stack, index));
@ -310,7 +310,7 @@ ThrowCompletionOr<u32> CyclicModule::inner_module_evaluation(VM& vm, Vector<Modu
for (auto& required : m_requested_modules) { for (auto& required : m_requested_modules) {
// a. Let requiredModule be ! HostResolveImportedModule(module, required). // a. Let requiredModule be ! HostResolveImportedModule(module, required).
auto* required_module = MUST(vm.host_resolve_imported_module(this, required)).ptr(); auto* required_module = MUST(vm.host_resolve_imported_module(this->make_weak_ptr(), required)).ptr();
// b. NOTE: Link must be completed successfully prior to invoking this method, so every requested module is guaranteed to resolve successfully. // b. NOTE: Link must be completed successfully prior to invoking this method, so every requested module is guaranteed to resolve successfully.
// c. Set index to ? InnerModuleEvaluation(requiredModule, stack, index). // c. Set index to ? InnerModuleEvaluation(requiredModule, stack, index).

View file

@ -63,7 +63,7 @@ ThrowCompletionOr<Value> Interpreter::run(Script& script_record)
script_context.realm = &script_record.realm(); script_context.realm = &script_record.realm();
// 5. Set the ScriptOrModule of scriptContext to scriptRecord. // 5. Set the ScriptOrModule of scriptContext to scriptRecord.
script_context.script_or_module = &script_record; script_context.script_or_module = script_record.make_weak_ptr();
// 6. Set the VariableEnvironment of scriptContext to globalEnv. // 6. Set the VariableEnvironment of scriptContext to globalEnv.
script_context.variable_environment = &global_environment; script_context.variable_environment = &global_environment;

View file

@ -53,7 +53,9 @@ struct ResolvedBinding {
}; };
// 16.2.1.4 Abstract Module Records, https://tc39.es/ecma262/#sec-abstract-module-records // 16.2.1.4 Abstract Module Records, https://tc39.es/ecma262/#sec-abstract-module-records
class Module : public RefCounted<Module> { class Module
: public RefCounted<Module>
, public Weakable<Module> {
public: public:
virtual ~Module(); virtual ~Module();

View file

@ -15,7 +15,7 @@
namespace JS { namespace JS {
using ScriptOrModule = Variant<Empty, Script*, Module*>; using ScriptOrModule = Variant<Empty, WeakPtr<Script>, WeakPtr<Module>>;
// 9.4 Execution Contexts, https://tc39.es/ecma262/#sec-execution-contexts // 9.4 Execution Contexts, https://tc39.es/ecma262/#sec-execution-contexts
struct ExecutionContext { struct ExecutionContext {

View file

@ -770,7 +770,7 @@ ThrowCompletionOr<void> VM::link_and_eval_module(Module& module)
dbgln("Warning: Using multiple modules as entry point can lead to unexpected results"); dbgln("Warning: Using multiple modules as entry point can lead to unexpected results");
m_loaded_modules.empend( m_loaded_modules.empend(
&module, module.make_weak_ptr(),
module.filename(), module.filename(),
String {}, // Null type String {}, // Null type
module, module,
@ -836,7 +836,7 @@ ThrowCompletionOr<NonnullRefPtr<Module>> VM::resolve_imported_module(ScriptOrMod
[&](Empty) { [&](Empty) {
return "."sv; return "."sv;
}, },
[&](auto* script_or_module) { [&](auto& script_or_module) {
return script_or_module->filename(); return script_or_module->filename();
}); });

View file

@ -16,7 +16,9 @@
namespace JS { namespace JS {
// 16.1.4 Script Records, https://tc39.es/ecma262/#sec-script-records // 16.1.4 Script Records, https://tc39.es/ecma262/#sec-script-records
class Script : public RefCounted<Script> { class Script
: public RefCounted<Script>
, public Weakable<Script> {
public: public:
~Script(); ~Script();
static Result<NonnullRefPtr<Script>, Vector<Parser::Error>> parse(StringView source_text, Realm&, StringView filename = {}); static Result<NonnullRefPtr<Script>, Vector<Parser::Error>> parse(StringView source_text, Realm&, StringView filename = {});

View file

@ -280,7 +280,7 @@ ThrowCompletionOr<Vector<FlyString>> SourceTextModule::get_exported_names(VM& vm
// 7. For each ExportEntry Record e of module.[[StarExportEntries]], do // 7. For each ExportEntry Record e of module.[[StarExportEntries]], do
for (auto& entry : m_star_export_entries) { for (auto& entry : m_star_export_entries) {
// a. Let requestedModule be ? HostResolveImportedModule(module, e.[[ModuleRequest]]). // a. Let requestedModule be ? HostResolveImportedModule(module, e.[[ModuleRequest]]).
auto requested_module = TRY(vm.host_resolve_imported_module(this, entry.module_request())); auto requested_module = TRY(vm.host_resolve_imported_module(this->make_weak_ptr(), entry.module_request()));
// b. Let starNames be ? requestedModule.GetExportedNames(exportStarSet). // b. Let starNames be ? requestedModule.GetExportedNames(exportStarSet).
auto star_names = TRY(requested_module->get_exported_names(vm, export_star_set)); auto star_names = TRY(requested_module->get_exported_names(vm, export_star_set));
@ -336,7 +336,7 @@ Completion SourceTextModule::initialize_environment(VM& vm)
// 7. For each ImportEntry Record in of module.[[ImportEntries]], do // 7. For each ImportEntry Record in of module.[[ImportEntries]], do
for (auto& import_entry : m_import_entries) { for (auto& import_entry : m_import_entries) {
// a. Let importedModule be ! HostResolveImportedModule(module, in.[[ModuleRequest]]). // a. Let importedModule be ! HostResolveImportedModule(module, in.[[ModuleRequest]]).
auto imported_module = MUST(vm.host_resolve_imported_module(this, import_entry.module_request())); auto imported_module = MUST(vm.host_resolve_imported_module(this->make_weak_ptr(), import_entry.module_request()));
// b. NOTE: The above call cannot fail because imported module requests are a subset of module.[[RequestedModules]], and these have been resolved earlier in this algorithm. // b. NOTE: The above call cannot fail because imported module requests are a subset of module.[[RequestedModules]], and these have been resolved earlier in this algorithm.
// c. If in.[[ImportName]] is namespace-object, then // c. If in.[[ImportName]] is namespace-object, then
@ -390,7 +390,7 @@ Completion SourceTextModule::initialize_environment(VM& vm)
m_execution_context.realm = &realm(); m_execution_context.realm = &realm();
// 12. Set the ScriptOrModule of moduleContext to module. // 12. Set the ScriptOrModule of moduleContext to module.
m_execution_context.script_or_module = this; m_execution_context.script_or_module = this->make_weak_ptr();
// 13. Set the VariableEnvironment of moduleContext to module.[[Environment]]. // 13. Set the VariableEnvironment of moduleContext to module.[[Environment]].
m_execution_context.variable_environment = environment; m_execution_context.variable_environment = environment;
@ -536,7 +536,7 @@ ThrowCompletionOr<ResolvedBinding> SourceTextModule::resolve_export(VM& vm, FlyS
continue; continue;
// i. Let importedModule be ? HostResolveImportedModule(module, e.[[ModuleRequest]]). // i. Let importedModule be ? HostResolveImportedModule(module, e.[[ModuleRequest]]).
auto imported_module = TRY(vm.host_resolve_imported_module(this, entry.module_request())); auto imported_module = TRY(vm.host_resolve_imported_module(this->make_weak_ptr(), entry.module_request()));
// ii. If e.[[ImportName]] is all, then // ii. If e.[[ImportName]] is all, then
if (entry.kind == ExportStatement::ExportEntry::Kind::ModuleRequestAll) { if (entry.kind == ExportStatement::ExportEntry::Kind::ModuleRequestAll) {
@ -576,7 +576,7 @@ ThrowCompletionOr<ResolvedBinding> SourceTextModule::resolve_export(VM& vm, FlyS
// 8. For each ExportEntry Record e of module.[[StarExportEntries]], do // 8. For each ExportEntry Record e of module.[[StarExportEntries]], do
for (auto& entry : m_star_export_entries) { for (auto& entry : m_star_export_entries) {
// a. Let importedModule be ? HostResolveImportedModule(module, e.[[ModuleRequest]]). // a. Let importedModule be ? HostResolveImportedModule(module, e.[[ModuleRequest]]).
auto imported_module = TRY(vm.host_resolve_imported_module(this, entry.module_request())); auto imported_module = TRY(vm.host_resolve_imported_module(this->make_weak_ptr(), entry.module_request()));
// b. Let resolution be ? importedModule.ResolveExport(exportName, resolveSet). // b. Let resolution be ? importedModule.ResolveExport(exportName, resolveSet).
auto resolution = TRY(imported_module->resolve_export(vm, export_name, resolve_set)); auto resolution = TRY(imported_module->resolve_export(vm, export_name, resolve_set));
@ -638,7 +638,7 @@ Completion SourceTextModule::execute_module(VM& vm, Optional<PromiseCapability>
module_context.realm = &realm(); module_context.realm = &realm();
// 4. Set the ScriptOrModule of moduleContext to module. // 4. Set the ScriptOrModule of moduleContext to module.
module_context.script_or_module = this; module_context.script_or_module = this->make_weak_ptr();
// 5. Assert: module has been linked and declarations in its module environment have been instantiated. // 5. Assert: module has been linked and declarations in its module environment have been instantiated.
VERIFY(m_status != ModuleStatus::Unlinked && m_status != ModuleStatus::Linking && environment()); VERIFY(m_status != ModuleStatus::Unlinked && m_status != ModuleStatus::Linking && environment());

View file

@ -89,7 +89,7 @@ ThrowCompletionOr<Promise*> JS::SyntheticModule::evaluate(VM& vm)
module_context.realm = &realm(); module_context.realm = &realm();
// 5. Set the ScriptOrModule of moduleContext to module. // 5. Set the ScriptOrModule of moduleContext to module.
module_context.script_or_module = this; module_context.script_or_module = this->make_weak_ptr();
// 6. Set the VariableEnvironment of moduleContext to module.[[Environment]]. // 6. Set the VariableEnvironment of moduleContext to module.[[Environment]].
module_context.variable_environment = environment(); module_context.variable_environment = environment();