diff options
-rw-r--r-- | src/interp/interp-wasm-c-api.cc | 8 | ||||
-rw-r--r-- | src/interp/interp.cc | 2 | ||||
-rw-r--r-- | src/interp/interp.h | 6 | ||||
-rw-r--r-- | src/test-interp.cc | 75 | ||||
-rw-r--r-- | src/tools/spectest-interp.cc | 3 | ||||
-rw-r--r-- | src/tools/wasm-interp.cc | 4 |
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(¶ms, 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(¶ms, 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); |