diff --git a/lib/fizzy/execute.cpp b/lib/fizzy/execute.cpp index 37245830f9..7553dc6ed6 100644 --- a/lib/fizzy/execute.cpp +++ b/lib/fizzy/execute.cpp @@ -81,7 +81,7 @@ inline bool invoke_function(const FuncType& func_type, uint32_t func_idx, Instan OperandStack& stack, int depth) noexcept { const auto func = [func_idx](Instance& _instance, span args, int _depth) noexcept { - return execute(_instance, func_idx, args, _depth); + return execute(_instance, func_idx, args.begin(), _depth); }; return invoke_function(func_type, func, instance, stack, depth); } @@ -461,23 +461,23 @@ __attribute__((no_sanitize("float-cast-overflow"))) inline constexpr float demot } // namespace -ExecutionResult execute( - Instance& instance, FuncIdx func_idx, span args, int depth) noexcept +ExecutionResult execute(Instance& instance, FuncIdx func_idx, const Value* args, int depth) noexcept { assert(depth >= 0); if (depth > CallStackLimit) return Trap; - assert(args.size() == instance.module.get_function_type(func_idx).inputs.size()); + const auto& func_type = instance.module.get_function_type(func_idx); assert(instance.module.imported_function_types.size() == instance.imported_functions.size()); if (func_idx < instance.imported_functions.size()) - return instance.imported_functions[func_idx].function(instance, args, depth); + return instance.imported_functions[func_idx].function( + instance, {args, func_type.inputs.size()}, depth); const auto& code = instance.module.get_code(func_idx); auto* const memory = instance.memory.get(); - OperandStack stack(args.data(), func_type.inputs.size(), code.local_count, + OperandStack stack(args, func_type.inputs.size(), code.local_count, static_cast(code.max_stack_height)); const Instr* pc = code.instructions.data(); diff --git a/lib/fizzy/execute.hpp b/lib/fizzy/execute.hpp index a71e67cabd..66c3d9a4b3 100644 --- a/lib/fizzy/execute.hpp +++ b/lib/fizzy/execute.hpp @@ -38,11 +38,12 @@ constexpr ExecutionResult Trap{false}; // Execute a function on an instance. ExecutionResult execute( - Instance& instance, FuncIdx func_idx, span args, int depth = 0) noexcept; + Instance& instance, FuncIdx func_idx, const Value* args, int depth = 0) noexcept; inline ExecutionResult execute( Instance& instance, FuncIdx func_idx, std::initializer_list args) noexcept { - return execute(instance, func_idx, span{args}); + assert(args.size() == instance.module.get_function_type(func_idx).inputs.size()); + return execute(instance, func_idx, args.begin()); } } // namespace fizzy diff --git a/lib/fizzy/instantiate.cpp b/lib/fizzy/instantiate.cpp index 4353803dbf..59e7fd112d 100644 --- a/lib/fizzy/instantiate.cpp +++ b/lib/fizzy/instantiate.cpp @@ -328,7 +328,7 @@ std::unique_ptr instantiate(Module module, for (const auto idx : instance->module.elementsec[i].init) { auto func = [idx, &instance_ref = *instance](fizzy::Instance&, span args, - int depth) { return execute(instance_ref, idx, args, depth); }; + int depth) { return execute(instance_ref, idx, args.begin(), depth); }; *it_table++ = ExternalFunction{std::move(func), instance->module.get_function_type(idx)}; @@ -433,7 +433,7 @@ std::optional find_exported_function(Instance& instance, std:: const auto idx = *opt_index; auto func = [idx, &instance](fizzy::Instance&, span args, int depth) { - return execute(instance, idx, args, depth); + return execute(instance, idx, args.begin(), depth); }; return ExternalFunction{std::move(func), instance.module.get_function_type(idx)}; diff --git a/test/spectests/spectests.cpp b/test/spectests/spectests.cpp index f1e14bd24d..de6830efdc 100644 --- a/test/spectests/spectests.cpp +++ b/test/spectests/spectests.cpp @@ -480,7 +480,7 @@ class test_runner args.push_back(*arg_value); } - return fizzy::execute(*instance, *func_idx, args); + return fizzy::execute(*instance, *func_idx, args.data()); } bool check_integer_result(fizzy::Value actual_value, const json& expected) diff --git a/test/unittests/execute_call_test.cpp b/test/unittests/execute_call_test.cpp index a338459df0..dbf5312b88 100644 --- a/test/unittests/execute_call_test.cpp +++ b/test/unittests/execute_call_test.cpp @@ -338,7 +338,7 @@ TEST(execute_call, imported_function_from_another_module) ASSERT_TRUE(func_idx.has_value()); auto sub = [&instance1, func_idx](Instance&, span args, int) -> ExecutionResult { - return fizzy::execute(*instance1, *func_idx, args); + return fizzy::execute(*instance1, *func_idx, args.begin()); }; auto instance2 = instantiate(module2, {{sub, module1.typesec[0]}}); diff --git a/test/unittests/execute_test.cpp b/test/unittests/execute_test.cpp index af6e79713c..0db93c1e40 100644 --- a/test/unittests/execute_test.cpp +++ b/test/unittests/execute_test.cpp @@ -980,7 +980,7 @@ TEST(execute, reuse_args) const std::vector args{20, 3}; const auto expected = args[0].i64 % (args[0].i64 / args[1].i64); - EXPECT_THAT(execute(*instance, 0, args), Result(expected)); + EXPECT_THAT(execute(*instance, 0, args.data()), Result(expected)); EXPECT_THAT(args[0].i64, 20); EXPECT_THAT(args[1].i64, 3); diff --git a/test/utils/fizzy_engine.cpp b/test/utils/fizzy_engine.cpp index 5d3abdcf43..1928ff685e 100644 --- a/test/utils/fizzy_engine.cpp +++ b/test/utils/fizzy_engine.cpp @@ -136,8 +136,7 @@ WasmEngine::Result FizzyEngine::execute( { static_assert(sizeof(uint64_t) == sizeof(Value)); const auto first_arg = reinterpret_cast(args.data()); - const auto status = fizzy::execute( - *m_instance, static_cast(func_ref), span(first_arg, args.size())); + const auto status = fizzy::execute(*m_instance, static_cast(func_ref), first_arg); if (status.trapped) return {true, std::nullopt}; else if (status.has_value)