mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:17:45 +00:00
LibWasm: Make the instantiation process produce an OwnPtr
Managing the instantiated modules becomes a pain if they're on the stack, since an instantiated module will eventually reference itself. To make using this simpler, just avoid copying the instance.
This commit is contained in:
parent
efb106069b
commit
3283c8a495
5 changed files with 15 additions and 20 deletions
|
@ -60,7 +60,7 @@ private:
|
||||||
|
|
||||||
static Wasm::AbstractMachine m_machine;
|
static Wasm::AbstractMachine m_machine;
|
||||||
Optional<Wasm::Module> m_module;
|
Optional<Wasm::Module> m_module;
|
||||||
Optional<Wasm::ModuleInstance> m_module_instance;
|
OwnPtr<Wasm::ModuleInstance> m_module_instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
Wasm::AbstractMachine WebAssemblyModule::m_machine;
|
Wasm::AbstractMachine WebAssemblyModule::m_machine;
|
||||||
|
@ -149,15 +149,6 @@ JS_DEFINE_NATIVE_FUNCTION(WebAssemblyModule::wasm_invoke)
|
||||||
auto address = static_cast<unsigned long>(vm.argument(0).to_double(global_object));
|
auto address = static_cast<unsigned long>(vm.argument(0).to_double(global_object));
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
auto this_value = vm.this_value(global_object);
|
|
||||||
auto object = this_value.to_object(global_object);
|
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
if (!object || !is<WebAssemblyModule>(object)) {
|
|
||||||
vm.throw_exception<JS::TypeError>(global_object, "Not a WebAssemblyModule");
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
auto instance = static_cast<WebAssemblyModule*>(object);
|
|
||||||
Wasm::FunctionAddress function_address { address };
|
Wasm::FunctionAddress function_address { address };
|
||||||
auto function_instance = WebAssemblyModule::machine().store().get(function_address);
|
auto function_instance = WebAssemblyModule::machine().store().get(function_address);
|
||||||
if (!function_instance) {
|
if (!function_instance) {
|
||||||
|
|
|
@ -85,7 +85,8 @@ GlobalInstance* Store::get(GlobalAddress address)
|
||||||
|
|
||||||
InstantiationResult AbstractMachine::instantiate(const Module& module, Vector<ExternValue> externs)
|
InstantiationResult AbstractMachine::instantiate(const Module& module, Vector<ExternValue> externs)
|
||||||
{
|
{
|
||||||
ModuleInstance main_module_instance;
|
auto main_module_instance_pointer = make<ModuleInstance>();
|
||||||
|
auto& main_module_instance = *main_module_instance_pointer;
|
||||||
Optional<InstantiationResult> instantiation_result;
|
Optional<InstantiationResult> instantiation_result;
|
||||||
|
|
||||||
module.for_each_section_of_type<TypeSection>([&](const TypeSection& section) {
|
module.for_each_section_of_type<TypeSection>([&](const TypeSection& section) {
|
||||||
|
@ -181,7 +182,10 @@ InstantiationResult AbstractMachine::instantiate(const Module& module, Vector<Ex
|
||||||
invoke(functions[index.value()], {});
|
invoke(functions[index.value()], {});
|
||||||
});
|
});
|
||||||
|
|
||||||
return instantiation_result.value_or(move(main_module_instance));
|
if (instantiation_result.has_value())
|
||||||
|
return instantiation_result.release_value();
|
||||||
|
|
||||||
|
return InstantiationResult { move(main_module_instance_pointer) };
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<InstantiationError> AbstractMachine::allocate_all(const Module& module, ModuleInstance& module_instance, Vector<ExternValue>& externs, Vector<Value>& global_values)
|
Optional<InstantiationError> AbstractMachine::allocate_all(const Module& module, ModuleInstance& module_instance, Vector<ExternValue>& externs, Vector<Value>& global_values)
|
||||||
|
|
|
@ -219,7 +219,7 @@ public:
|
||||||
auto& code() const { return m_code; }
|
auto& code() const { return m_code; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const FunctionType& m_type;
|
FunctionType m_type;
|
||||||
const ModuleInstance& m_module;
|
const ModuleInstance& m_module;
|
||||||
const Module::Function& m_code;
|
const Module::Function& m_code;
|
||||||
};
|
};
|
||||||
|
@ -237,7 +237,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FlatPtr m_ptr { 0 };
|
FlatPtr m_ptr { 0 };
|
||||||
const FunctionType& m_type;
|
FunctionType m_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
using FunctionInstance = Variant<WasmFunction, HostFunction>;
|
using FunctionInstance = Variant<WasmFunction, HostFunction>;
|
||||||
|
@ -418,7 +418,7 @@ private:
|
||||||
Vector<EntryType> m_data;
|
Vector<EntryType> m_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
using InstantiationResult = AK::Result<ModuleInstance, InstantiationError>;
|
using InstantiationResult = AK::Result<NonnullOwnPtr<ModuleInstance>, InstantiationError>;
|
||||||
|
|
||||||
class AbstractMachine {
|
class AbstractMachine {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -955,10 +955,10 @@ class Module {
|
||||||
public:
|
public:
|
||||||
class Function {
|
class Function {
|
||||||
public:
|
public:
|
||||||
explicit Function(TypeIndex type, Vector<ValueType> local_types, const Expression& body)
|
explicit Function(TypeIndex type, Vector<ValueType> local_types, Expression body)
|
||||||
: m_type(type)
|
: m_type(type)
|
||||||
, m_local_types(move(local_types))
|
, m_local_types(move(local_types))
|
||||||
, m_body(body)
|
, m_body(move(body))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -969,7 +969,7 @@ public:
|
||||||
private:
|
private:
|
||||||
TypeIndex m_type;
|
TypeIndex m_type;
|
||||||
Vector<ValueType> m_local_types;
|
Vector<ValueType> m_local_types;
|
||||||
const Expression& m_body;
|
Expression m_body;
|
||||||
};
|
};
|
||||||
|
|
||||||
using AnySection = Variant<
|
using AnySection = Variant<
|
||||||
|
|
|
@ -91,7 +91,7 @@ int main(int argc, char* argv[])
|
||||||
};
|
};
|
||||||
if (print) {
|
if (print) {
|
||||||
// Now, let's dump the functions!
|
// Now, let's dump the functions!
|
||||||
for (auto& address : module_instance.functions()) {
|
for (auto& address : module_instance->functions()) {
|
||||||
print_func(address);
|
print_func(address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ int main(int argc, char* argv[])
|
||||||
if (!exported_function_to_execute.is_empty()) {
|
if (!exported_function_to_execute.is_empty()) {
|
||||||
Optional<Wasm::FunctionAddress> run_address;
|
Optional<Wasm::FunctionAddress> run_address;
|
||||||
Vector<Wasm::Value> values;
|
Vector<Wasm::Value> values;
|
||||||
for (auto& entry : module_instance.exports()) {
|
for (auto& entry : module_instance->exports()) {
|
||||||
if (entry.name() == exported_function_to_execute) {
|
if (entry.name() == exported_function_to_execute) {
|
||||||
if (auto addr = entry.value().get_pointer<Wasm::FunctionAddress>())
|
if (auto addr = entry.value().get_pointer<Wasm::FunctionAddress>())
|
||||||
run_address = *addr;
|
run_address = *addr;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue