summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interp/interp-wasm-c-api.cc8
-rw-r--r--src/interp/interp.cc2
-rw-r--r--src/interp/interp.h6
-rw-r--r--src/test-interp.cc75
-rw-r--r--src/tools/spectest-interp.cc3
-rw-r--r--src/tools/wasm-interp.cc4
6 files changed, 52 insertions, 46 deletions
diff --git a/src/interp/interp-wasm-c-api.cc b/src/interp/interp-wasm-c-api.cc
index 5304b604..193f1144 100644
--- a/src/interp/interp-wasm-c-api.cc
+++ b/src/interp/interp-wasm-c-api.cc
@@ -730,8 +730,8 @@ own wasm_func_t* wasm_func_new(wasm_store_t* store,
const wasm_functype_t* type,
wasm_func_callback_t callback) {
FuncType wabt_type = *type->As<FuncType>();
- auto lambda = [=](const Values& wabt_params, Values& wabt_results,
- Trap::Ptr* out_trap) -> Result {
+ auto lambda = [=](Thread& thread, const Values& wabt_params,
+ Values& wabt_results, Trap::Ptr* out_trap) -> Result {
wasm_val_vec_t params, results;
wasm_val_vec_new_uninitialized(&params, wabt_params.size());
wasm_val_vec_new_uninitialized(&results, wabt_results.size());
@@ -759,8 +759,8 @@ own wasm_func_t* wasm_func_new_with_env(wasm_store_t* store,
void* env,
void (*finalizer)(void*)) {
FuncType wabt_type = *type->As<FuncType>();
- auto lambda = [=](const Values& wabt_params, Values& wabt_results,
- Trap::Ptr* out_trap) -> Result {
+ auto lambda = [=](Thread& thread, const Values& wabt_params,
+ Values& wabt_results, Trap::Ptr* out_trap) -> Result {
wasm_val_vec_t params, results;
wasm_val_vec_new_uninitialized(&params, wabt_params.size());
wasm_val_vec_new_uninitialized(&results, wabt_results.size());
diff --git a/src/interp/interp.cc b/src/interp/interp.cc
index f58dcd9f..4704500e 100644
--- a/src/interp/interp.cc
+++ b/src/interp/interp.cc
@@ -421,7 +421,7 @@ Result HostFunc::DoCall(Thread& thread,
const Values& params,
Values& results,
Trap::Ptr* out_trap) {
- return callback_(params, results, out_trap);
+ return callback_(thread, params, results, out_trap);
}
//// Table ////
diff --git a/src/interp/interp.h b/src/interp/interp.h
index 971df7c9..c0ca9d0f 100644
--- a/src/interp/interp.h
+++ b/src/interp/interp.h
@@ -701,8 +701,10 @@ class HostFunc : public Func {
static const char* GetTypeName() { return "HostFunc"; }
using Ptr = RefPtr<HostFunc>;
- using Callback = std::function<
- Result(const Values& params, Values& results, Trap::Ptr* out_trap)>;
+ using Callback = std::function<Result(Thread& thread,
+ const Values& params,
+ Values& results,
+ Trap::Ptr* out_trap)>;
static HostFunc::Ptr New(Store&, FuncType, Callback);
diff --git a/src/test-interp.cc b/src/test-interp.cc
index b72d1bac..983aae5f 100644
--- a/src/test-interp.cc
+++ b/src/test-interp.cc
@@ -275,12 +275,13 @@ TEST_F(InterpTest, HostFunc) {
0x08, 0x01, 0x06, 0x00, 0x41, 0x01, 0x10, 0x00, 0x0b,
});
- auto host_func = HostFunc::New(
- store_, FuncType{{ValueType::I32}, {ValueType::I32}},
- [](const Values& params, Values& results, Trap::Ptr* out_trap) -> Result {
- results[0] = Value::Make(params[0].Get<u32>() + 1);
- return Result::Ok;
- });
+ auto host_func =
+ HostFunc::New(store_, FuncType{{ValueType::I32}, {ValueType::I32}},
+ [](Thread& thread, const Values& params, Values& results,
+ Trap::Ptr* out_trap) -> Result {
+ results[0] = Value::Make(params[0].Get<u32>() + 1);
+ return Result::Ok;
+ });
Instantiate({host_func->self()});
@@ -306,7 +307,7 @@ TEST_F(InterpTest, HostFunc_PingPong) {
auto host_func = HostFunc::New(
store_, FuncType{{ValueType::I32}, {ValueType::I32}},
- [&](const Values& params, Values& results,
+ [&](Thread& thread, const Values& params, Values& results,
Trap::Ptr* out_trap) -> Result {
auto val = params[0].Get<u32>();
if (val < 10) {
@@ -344,18 +345,18 @@ TEST_F(InterpTest, HostFunc_PingPong_SameThread) {
auto thread = Thread::New(store_, {});
- auto host_func = HostFunc::New(
- store_, FuncType{{ValueType::I32}, {ValueType::I32}},
- [&](const Values& params, Values& results,
- Trap::Ptr* out_trap) -> Result {
- auto val = params[0].Get<u32>();
- if (val < 10) {
- return GetFuncExport(0)->Call(*thread, {Value::Make(val * 2)}, results,
- out_trap);
- }
- results[0] = Value::Make(val);
- return Result::Ok;
- });
+ auto host_func =
+ HostFunc::New(store_, FuncType{{ValueType::I32}, {ValueType::I32}},
+ [&](Thread& t, const Values& params, Values& results,
+ Trap::Ptr* out_trap) -> Result {
+ auto val = params[0].Get<u32>();
+ if (val < 10) {
+ return GetFuncExport(0)->Call(t, {Value::Make(val * 2)},
+ results, out_trap);
+ }
+ results[0] = Value::Make(val);
+ return Result::Ok;
+ });
Instantiate({host_func->self()});
@@ -382,12 +383,13 @@ TEST_F(InterpTest, HostTrap) {
0x0a, 0x06, 0x01, 0x04, 0x00, 0x10, 0x00, 0x0b,
});
- auto host_func = HostFunc::New(store_, FuncType{{}, {}},
- [&](const Values& params, Values& results,
- Trap::Ptr* out_trap) -> Result {
- *out_trap = Trap::New(store_, "boom");
- return Result::Error;
- });
+ auto host_func =
+ HostFunc::New(store_, FuncType{{}, {}},
+ [&](Thread& thread, const Values& params, Values& results,
+ Trap::Ptr* out_trap) -> Result {
+ *out_trap = Trap::New(store_, "boom");
+ return Result::Error;
+ });
mod_ = Module::New(store_, module_desc_);
RefPtr<Trap> trap;
@@ -475,18 +477,19 @@ TEST_F(InterpTest, Rot13) {
0x41, 0x00, 0x20, 0x00, 0x10, 0x01, 0x0b,
});
- auto host_func = HostFunc::New(
- store_, FuncType{{ValueType::I32}, {ValueType::I32}},
- [](const Values& params, Values& results, Trap::Ptr* out_trap) -> Result {
- results[0] = Value::Make(params[0].Get<u32>() + 1);
- return Result::Ok;
- });
+ auto host_func =
+ HostFunc::New(store_, FuncType{{ValueType::I32}, {ValueType::I32}},
+ [](Thread& thread, const Values& params, Values& results,
+ Trap::Ptr* out_trap) -> Result {
+ results[0] = Value::Make(params[0].Get<u32>() + 1);
+ return Result::Ok;
+ });
std::string string_data = "Hello, WebAssembly!";
auto memory = Memory::New(store_, MemoryType{Limits{1}});
- auto fill_buf = [&](const Values& params, Values& results,
+ auto fill_buf = [&](Thread& thread, const Values& params, Values& results,
Trap::Ptr* out_trap) -> Result {
// (param $ptr i32) (param $max_size i32) (result $size i32)
EXPECT_EQ(2u, params.size());
@@ -508,7 +511,7 @@ TEST_F(InterpTest, Rot13) {
store_, FuncType{{ValueType::I32, ValueType::I32}, {ValueType::I32}},
fill_buf);
- auto buf_done = [&](const Values& params, Values& results,
+ auto buf_done = [&](Thread& thread, const Values& params, Values& results,
Trap::Ptr* out_trap) -> Result {
// (param $ptr i32) (param $size i32)
EXPECT_EQ(2u, params.size());
@@ -639,9 +642,9 @@ TEST_F(InterpGCTest, Collect_InstanceImport) {
0x00, 0x01, 0x74, 0x01, 0x70, 0x00, 0x00, 0x00, 0x01, 0x6d, 0x02,
0x00, 0x00, 0x00, 0x01, 0x67, 0x03, 0x7f, 0x00,
});
- auto f = HostFunc::New(
- store_, FuncType{{}, {}},
- [](const Values&, Values&, Trap::Ptr*) -> Result { return Result::Ok; });
+ auto f = HostFunc::New(store_, FuncType{{}, {}},
+ [](Thread& thread, const Values&, Values&,
+ Trap::Ptr*) -> Result { return Result::Ok; });
auto t = Table::New(store_, TableType{ValueType::Funcref, Limits{0}});
auto m = Memory::New(store_, MemoryType{Limits{0}});
auto g = Global::New(store_, GlobalType{ValueType::I32, Mutability::Const},
diff --git a/src/tools/spectest-interp.cc b/src/tools/spectest-interp.cc
index cc61e8c3..dc278954 100644
--- a/src/tools/spectest-interp.cc
+++ b/src/tools/spectest-interp.cc
@@ -1224,7 +1224,8 @@ CommandRunner::CommandRunner() : store_(s_features) {
auto import_name = StringPrintf("spectest.%s", print.name);
spectest[print.name] = HostFunc::New(
store_, print.type,
- [=](const Values& params, Values& results, Trap::Ptr* trap) -> wabt::Result {
+ [=](Thread& inst, const Values& params, Values& results,
+ Trap::Ptr* trap) -> wabt::Result {
printf("called host ");
WriteCall(s_stdout_stream.get(), import_name, print.type, params,
results, *trap);
diff --git a/src/tools/wasm-interp.cc b/src/tools/wasm-interp.cc
index 733c54cd..4d63134c 100644
--- a/src/tools/wasm-interp.cc
+++ b/src/tools/wasm-interp.cc
@@ -171,8 +171,8 @@ Result ReadAndInstantiateModule(const char* module_filename,
auto host_func =
HostFunc::New(s_store, func_type,
- [=](const Values& params, Values& results,
- Trap::Ptr* trap) -> Result {
+ [=](Thread& thread, const Values& params,
+ Values& results, Trap::Ptr* trap) -> Result {
printf("called host ");
WriteCall(stream, import_name, func_type, params,
results, *trap);