Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ bazel_dep(name = "ecsact_runtime", version = "0.7.0")
bazel_dep(name = "rules_ecsact", version = "0.5.8")
bazel_dep(name = "docopt.cpp", version = "0.6.2")
bazel_dep(name = "magic_enum", version = "0.9.3")
bazel_dep(name = "rules_wasmer", version = "0.1.1")
bazel_dep(name = "rules_wasmer", version = "0.1.2")
bazel_dep(name = "ecsact_cli", version = "0.3.19")
bazel_dep(name = "platforms", version = "0.0.10")

Expand Down
16 changes: 16 additions & 0 deletions ecsact/wasm/detail/emscripten_debug.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include "ecsact/wasm/detail/emscripten_debug.hh"
#include <stdexcept>

auto ecsact::wasm::detail::emscripten_debug_segfault(
const wasm_val_vec_t* args,
wasm_val_vec_t* results
) -> wasm_trap_t* {
throw std::logic_error{"segfault"};
}

auto ecsact::wasm::detail::emscripten_debug_alignfault(
const wasm_val_vec_t* args,
wasm_val_vec_t* results
) -> wasm_trap_t* {
throw std::logic_error{"alignfault"};
}
15 changes: 15 additions & 0 deletions ecsact/wasm/detail/emscripten_debug.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#pragma once

#include <wasm.h>

namespace ecsact::wasm::detail {
auto emscripten_debug_segfault(
const wasm_val_vec_t* args,
wasm_val_vec_t* results
) -> wasm_trap_t*;

auto emscripten_debug_alignfault(
const wasm_val_vec_t* args,
wasm_val_vec_t* results
) -> wasm_trap_t*;
} // namespace ecsact::wasm::detail
30 changes: 30 additions & 0 deletions ecsact/wasm/detail/guest_imports/emscripten_debug.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#pragma once

#include "ecsact/wasm/detail/guest_imports.hh"
#include "ecsact/wasm/detail/util.hh"
#include "ecsact/wasm/detail/emscripten_debug.hh"

namespace ecsact::wasm::detail {

const auto guest_emscripten_debug_module_imports = allowed_guest_imports_t{
{
"segfault",
[]() -> minst_import_resolve_func {
return {
wasm_functype_new_0_0(),
&emscripten_debug_segfault,
};
},
},
{
"alignfault",
[]() -> minst_import_resolve_func {
return {
wasm_functype_new_0_0(),
&emscripten_debug_alignfault,
};
},
}
};

} // namespace ecsact::wasm::detail
9 changes: 9 additions & 0 deletions ecsact/wasm/detail/minst/minst.cc
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,15 @@ auto minst::exports() -> std::span<minst_export> {
}

auto minst::initialize() -> std::optional<minst_trap> {
for(auto exp : exports()) {
if(exp.name() == "emscripten_stack_init") {
auto trap = exp.func_call();
if(trap) {
return trap;
}
break;
}
}
for(auto exp : exports()) {
if(exp.name() == "_initialize") {
return exp.func_call();
Expand Down
7 changes: 7 additions & 0 deletions ecsact/wasm/detail/wasm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "ecsact/wasm/detail/logger.hh"
#include "ecsact/wasm/detail/wasi_fs.hh"
#include "ecsact/wasm/detail/globals.hh"
#include "ecsact/wasm/detail/guest_imports/emscripten_debug.hh"
#include "ecsact/wasm/detail/guest_imports/wasi_snapshot_preview1.hh"
#include "ecsact/wasm/detail/guest_imports/env.hh"
#include "ecsact/wasm/detail/cpp_util.hh"
Expand Down Expand Up @@ -164,6 +165,7 @@ ecsactsi_wasm_error ecsactsi_wasm_load(
const char** wasm_exports
) {
using ecsact::wasm::detail::engine;
using ecsact::wasm::detail::guest_emscripten_debug_module_imports;
using ecsact::wasm::detail::minst;
using ecsact::wasm::detail::minst_error_code;
using ecsact::wasm::detail::minst_export;
Expand All @@ -180,6 +182,11 @@ ecsactsi_wasm_error ecsactsi_wasm_load(
if(imp.module() == "env") {
auto itr = guest_env_module_imports.find(method_name);
if(itr == guest_env_module_imports.end()) {
auto debug_itr =
guest_emscripten_debug_module_imports.find(method_name);
if(debug_itr != guest_emscripten_debug_module_imports.end()) {
return debug_itr->second();
}
return std::nullopt;
}
return itr->second();
Expand Down
2 changes: 1 addition & 1 deletion test/MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module(name = "ecsact_si_wasm_test")

bazel_dep(name = "rules_cc", version = "0.0.9")
bazel_dep(name = "ecsact_runtime", version = "0.7.0")
bazel_dep(name = "rules_wasmer", version = "0.1.1")
bazel_dep(name = "rules_wasmer", version = "0.1.2")
bazel_dep(name = "ecsact_rt_entt", version = "0.3.8")
bazel_dep(name = "ecsact_lang_cpp", version = "0.4.9")
bazel_dep(name = "ecsact_parse", version = "0.5.4")
Expand Down