Skip to content

Commit 4816192

Browse files
committed
Pass arguments as const Value*
1 parent b903ef9 commit 4816192

File tree

8 files changed

+19
-17
lines changed

8 files changed

+19
-17
lines changed

lib/fizzy/execute.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,29 +454,29 @@ inline bool invoke_function(const FuncType& func_type, uint32_t func_idx, Instan
454454
OperandStack& stack, int depth) noexcept
455455
{
456456
const auto func = [func_idx](Instance& _instance, span<const Value> args, int _depth) noexcept {
457-
return execute(_instance, func_idx, args, _depth);
457+
return execute(_instance, func_idx, args.data(), _depth);
458458
};
459459
return invoke_function(func_type, func, instance, stack, depth);
460460
}
461461
} // namespace
462462

463-
ExecutionResult execute(
464-
Instance& instance, FuncIdx func_idx, span<const Value> args, int depth) noexcept
463+
ExecutionResult execute(Instance& instance, FuncIdx func_idx, const Value* args, int depth) noexcept
465464
{
466465
assert(depth >= 0);
467466
if (depth > CallStackLimit)
468467
return Trap;
469468

470-
assert(args.size() == instance.module.get_function_type(func_idx).inputs.size());
469+
const auto& func_type = instance.module.get_function_type(func_idx);
471470

472471
assert(instance.module.imported_function_types.size() == instance.imported_functions.size());
473472
if (func_idx < instance.imported_functions.size())
474-
return instance.imported_functions[func_idx].function(instance, args, depth);
473+
return instance.imported_functions[func_idx].function(
474+
instance, {args, func_type.inputs.size()}, depth);
475475

476476
const auto& code = instance.module.get_code(func_idx);
477477
auto* const memory = instance.memory.get();
478478

479-
OperandStack stack(args.data(), func_type.inputs.size(), code.local_count,
479+
OperandStack stack(args, func_type.inputs.size(), code.local_count,
480480
static_cast<size_t>(code.max_stack_height));
481481

482482
const Instr* pc = code.instructions.data();

lib/fizzy/execute.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ constexpr ExecutionResult Trap{false};
3838

3939
// Execute a function on an instance.
4040
ExecutionResult execute(
41-
Instance& instance, FuncIdx func_idx, span<const Value> args, int depth = 0) noexcept;
41+
Instance& instance, FuncIdx func_idx, const Value* args, int depth = 0) noexcept;
4242

4343
inline ExecutionResult execute(
4444
Instance& instance, FuncIdx func_idx, std::initializer_list<Value> args) noexcept
4545
{
46-
return execute(instance, func_idx, span<const Value>{args});
46+
assert(args.size() == instance.module.get_function_type(func_idx).inputs.size());
47+
return execute(instance, func_idx, args.begin());
4748
}
4849
} // namespace fizzy

lib/fizzy/instantiate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ std::unique_ptr<Instance> instantiate(Module module,
328328
for (const auto idx : instance->module.elementsec[i].init)
329329
{
330330
auto func = [idx, &instance_ref = *instance](fizzy::Instance&, span<const Value> args,
331-
int depth) { return execute(instance_ref, idx, args, depth); };
331+
int depth) { return execute(instance_ref, idx, args.data(), depth); };
332332

333333
*it_table++ =
334334
ExternalFunction{std::move(func), instance->module.get_function_type(idx)};
@@ -433,7 +433,7 @@ std::optional<ExternalFunction> find_exported_function(Instance& instance, std::
433433

434434
const auto idx = *opt_index;
435435
auto func = [idx, &instance](fizzy::Instance&, span<const Value> args, int depth) {
436-
return execute(instance, idx, args, depth);
436+
return execute(instance, idx, args.data(), depth);
437437
};
438438

439439
return ExternalFunction{std::move(func), instance.module.get_function_type(idx)};

test/spectests/spectests.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,8 @@ class test_runner
480480
args.push_back(*arg_value);
481481
}
482482

483-
return fizzy::execute(*instance, *func_idx, args);
483+
assert(args.size() == instance->module.get_function_type(*func_idx).inputs.size());
484+
return fizzy::execute(*instance, *func_idx, args.data());
484485
}
485486

486487
bool check_integer_result(fizzy::Value actual_value, const json& expected)

test/testfloat/testfloat.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,7 @@ bool check(const FunctionDescription& func, fizzy::Instance& instance, const uin
336336
for (size_t i = 0; i < func.num_arguments; ++i)
337337
args[i] = make_value(func.param_types[i], inputs[i]);
338338

339-
const auto r = fizzy::execute(
340-
instance, func.idx, fizzy::span<const fizzy::Value>(args, func.num_arguments));
339+
const auto r = fizzy::execute(instance, func.idx, args);
341340

342341
if (func.options == Options::TrapIsInvalidOperation)
343342
{

test/unittests/execute_call_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ TEST(execute_call, imported_function_from_another_module)
338338
ASSERT_TRUE(func_idx.has_value());
339339

340340
auto sub = [&instance1, func_idx](Instance&, span<const Value> args, int) -> ExecutionResult {
341-
return fizzy::execute(*instance1, *func_idx, args);
341+
return fizzy::execute(*instance1, *func_idx, args.data());
342342
};
343343

344344
auto instance2 = instantiate(module2, {{sub, module1.typesec[0]}});

test/unittests/execute_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,7 @@ TEST(execute, reuse_args)
980980

981981
const std::vector<Value> args{20, 3};
982982
const auto expected = args[0].i64 % (args[0].i64 / args[1].i64);
983-
EXPECT_THAT(execute(*instance, 0, args), Result(expected));
983+
EXPECT_THAT(execute(*instance, 0, args.data()), Result(expected));
984984
EXPECT_THAT(args[0].i64, 20);
985985
EXPECT_THAT(args[1].i64, 3);
986986

test/utils/fizzy_engine.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,9 @@ WasmEngine::Result FizzyEngine::execute(
136136
{
137137
static_assert(sizeof(uint64_t) == sizeof(Value));
138138
const auto first_arg = reinterpret_cast<const Value*>(args.data());
139-
const auto status = fizzy::execute(
140-
*m_instance, static_cast<uint32_t>(func_ref), span<const Value>(first_arg, args.size()));
139+
assert(args.size() ==
140+
m_instance->module.get_function_type(static_cast<uint32_t>(func_ref)).inputs.size());
141+
const auto status = fizzy::execute(*m_instance, static_cast<uint32_t>(func_ref), first_arg);
141142
if (status.trapped)
142143
return {true, std::nullopt};
143144
else if (status.has_value)

0 commit comments

Comments
 (0)