Coverage Report

Created: 2026-06-30 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/WasmEdge/lib/driver/runtimeTool.cpp
Line
Count
Source
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright The WasmEdge Authors
3
4
#include "common/configure.h"
5
#include "common/filesystem.h"
6
#include "common/spdlog.h"
7
#include "common/types.h"
8
#include "common/version.h"
9
#include "driver/tool.h"
10
#include "host/wasi/wasimodule.h"
11
#include "vm/vm.h"
12
13
#include <algorithm>
14
#include <cctype>
15
#include <chrono>
16
#include <cstdint>
17
#include <cstdlib>
18
#include <optional>
19
#include <string>
20
#include <string_view>
21
#include <vector>
22
23
using namespace std::literals;
24
25
namespace WasmEdge {
26
namespace Driver {
27
28
0
std::optional<RunMode> parseRunModeArg(std::string_view S) noexcept {
29
0
  std::string Lower(S);
30
0
  std::transform(Lower.begin(), Lower.end(), Lower.begin(),
31
0
                 [](unsigned char C) -> char {
32
0
                   return static_cast<char>(std::tolower(C));
33
0
                 });
34
0
  if (Lower == "interpreter") {
35
0
    return RunMode::Interpreter;
36
0
  }
37
0
  if (Lower == "jit") {
38
0
    return RunMode::JIT;
39
0
  }
40
0
  if (Lower == "aot") {
41
0
    return RunMode::AOT;
42
0
  }
43
0
  if (Lower == "lazyjit") {
44
0
    return RunMode::LazyJIT;
45
0
  }
46
0
  return std::nullopt;
47
0
}
48
49
namespace {
50
51
// Helper template to parse numeric arguments and catch conversion exceptions
52
template <typename Converter, typename ValVec, typename TypeVec, typename TC>
53
bool parseNumericArg(const std::string &Value, size_t ParamIndex,
54
                     std::string_view TypeName, Converter Conv,
55
0
                     ValVec &FuncArgs, TypeVec &FuncArgTypes, TC TCode) {
56
0
  try {
57
0
    auto Out = Conv(Value);
58
0
    FuncArgs.emplace_back(Out);
59
0
    FuncArgTypes.emplace_back(TCode);
60
0
    return true;
61
0
  } catch (const std::invalid_argument &) {
62
0
    spdlog::error("Invalid argument '{}' for parameter {}: expected {}"sv,
63
0
                  Value, ParamIndex + 1, TypeName);
64
0
    return false;
65
0
  } catch (const std::out_of_range &) {
66
0
    spdlog::error("Argument '{}' for parameter {}: {} out of range"sv, Value,
67
0
                  ParamIndex + 1, TypeName);
68
0
    return false;
69
0
  }
70
0
}
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_0, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >, WasmEdge::TypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_0, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >&, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >&, WasmEdge::TypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_1, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >, WasmEdge::TypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_1, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >&, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >&, WasmEdge::TypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_2, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >, WasmEdge::TypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_2, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >&, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >&, WasmEdge::TypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_3, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >, WasmEdge::TypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_3, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >&, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >&, WasmEdge::TypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_4, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >, WasmEdge::TypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnModule(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::FunctionType const&)::$_4, std::__1::vector<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant>, std::__1::allocator<WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > >&, std::__1::vector<WasmEdge::ValType, std::__1::allocator<WasmEdge::ValType> >&, WasmEdge::TypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_0, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >, WasmEdge::ComponentTypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_0, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >&, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >&, WasmEdge::ComponentTypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_1, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >, WasmEdge::ComponentTypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_1, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >&, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >&, WasmEdge::ComponentTypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_2, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >, WasmEdge::ComponentTypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_2, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >&, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >&, WasmEdge::ComponentTypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_3, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >, WasmEdge::ComponentTypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_3, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >&, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >&, WasmEdge::ComponentTypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_4, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >, WasmEdge::ComponentTypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_4, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >&, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >&, WasmEdge::ComponentTypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_5, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >, WasmEdge::ComponentTypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_5, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >&, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >&, WasmEdge::ComponentTypeCode)
Unexecuted instantiation: runtimeTool.cpp:bool WasmEdge::Driver::(anonymous namespace)::parseNumericArg<WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_6, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >, WasmEdge::ComponentTypeCode>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::Driver::ToolOnComponent(WasmEdge::VM::VM&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::optional<std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l> > > >, WasmEdge::Driver::DriverToolOptions&, WasmEdge::AST::Component::FuncType const&)::$_6, std::__1::vector<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> >, std::__1::allocator<std::__1::variant<unsigned char, unsigned short, unsigned int, unsigned long, signed char, short, int, long, float, double, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, unsigned long __vector(2), long __vector(2), unsigned int __vector(4), int __vector(4), unsigned short __vector(8), short __vector(8), unsigned char __vector(16), signed char __vector(16), float __vector(4), double __vector(2), WasmEdge::RefVariant> > > >&, std::__1::vector<WasmEdge::ComponentValType, std::__1::allocator<WasmEdge::ComponentValType> >&, WasmEdge::ComponentTypeCode)
71
} // namespace
72
73
static int
74
ToolOnModule(WasmEdge::VM::VM &VM, const std::string &FuncName,
75
             std::optional<std::chrono::system_clock::time_point> Timeout,
76
             struct DriverToolOptions &Opt,
77
0
             const AST::FunctionType &FuncType) noexcept {
78
0
  std::vector<ValVariant> FuncArgs;
79
0
  std::vector<ValType> FuncArgTypes;
80
81
0
  const size_t Expected = FuncType.getParamTypes().size();
82
0
  const size_t Got = Opt.Args.value().size() - 1;
83
0
  if (Got < Expected) {
84
0
    spdlog::error("function `{}` expects {} argument(s), got {}"sv, FuncName,
85
0
                  Expected, Got);
86
0
    return EXIT_FAILURE;
87
0
  }
88
89
0
  for (size_t I = 0;
90
0
       I < FuncType.getParamTypes().size() && I + 1 < Opt.Args.value().size();
91
0
       ++I) {
92
0
    const auto TCode = FuncType.getParamTypes()[I].getCode();
93
0
    const auto &ArgValue = Opt.Args.value()[I + 1];
94
95
0
    switch (TCode) {
96
0
    case TypeCode::I32: {
97
0
      if (!parseNumericArg(
98
0
              ArgValue, I, "i32"sv,
99
0
              [](const std::string &S) {
100
0
                return static_cast<int32_t>(std::stol(S));
101
0
              },
102
0
              FuncArgs, FuncArgTypes, TCode)) {
103
0
        return EXIT_FAILURE;
104
0
      }
105
0
      break;
106
0
    }
107
0
    case TypeCode::I64: {
108
0
      if (!parseNumericArg(
109
0
              ArgValue, I, "i64"sv,
110
0
              [](const std::string &S) {
111
0
                return static_cast<int64_t>(std::stoll(S));
112
0
              },
113
0
              FuncArgs, FuncArgTypes, TCode)) {
114
0
        return EXIT_FAILURE;
115
0
      }
116
0
      break;
117
0
    }
118
0
    case TypeCode::F32: {
119
0
      if (!parseNumericArg(
120
0
              ArgValue, I, "f32"sv,
121
0
              [](const std::string &S) { return std::stof(S); }, FuncArgs,
122
0
              FuncArgTypes, TCode)) {
123
0
        return EXIT_FAILURE;
124
0
      }
125
0
      break;
126
0
    }
127
0
    case TypeCode::F64: {
128
0
      if (!parseNumericArg(
129
0
              ArgValue, I, "f64"sv,
130
0
              [](const std::string &S) { return std::stod(S); }, FuncArgs,
131
0
              FuncArgTypes, TCode)) {
132
0
        return EXIT_FAILURE;
133
0
      }
134
0
      break;
135
0
    }
136
    // TODO: FuncRef and ExternRef
137
0
    default:
138
0
      break;
139
0
    }
140
0
  }
141
0
  if (FuncType.getParamTypes().size() + 1 < Opt.Args.value().size()) {
142
0
    for (size_t I = FuncType.getParamTypes().size() + 1;
143
0
         I < Opt.Args.value().size(); ++I) {
144
0
      if (!parseNumericArg(
145
0
              Opt.Args.value()[I], I, "i64"sv,
146
0
              [](const std::string &S) {
147
0
                return static_cast<uint64_t>(std::stoll(S));
148
0
              },
149
0
              FuncArgs, FuncArgTypes, TypeCode::I64)) {
150
0
        return EXIT_FAILURE;
151
0
      }
152
0
    }
153
0
  }
154
155
0
  auto AsyncResult = VM.asyncExecute(FuncName, FuncArgs, FuncArgTypes);
156
0
  if (Timeout.has_value()) {
157
0
    if (!AsyncResult.waitUntil(*Timeout)) {
158
0
      AsyncResult.cancel();
159
0
    }
160
0
  }
161
0
  if (auto Result = AsyncResult.get()) {
162
    // Print results.
163
0
    for (size_t I = 0; I < Result->size(); ++I) {
164
0
      switch ((*Result)[I].second.getCode()) {
165
0
      case TypeCode::I32:
166
0
        fmt::print("{}\n"sv, (*Result)[I].first.get<int32_t>());
167
0
        break;
168
0
      case TypeCode::I64:
169
0
        fmt::print("{}\n"sv, (*Result)[I].first.get<int64_t>());
170
0
        break;
171
0
      case TypeCode::F32:
172
0
        fmt::print("{}\n"sv, (*Result)[I].first.get<float>());
173
0
        break;
174
0
      case TypeCode::F64:
175
0
        fmt::print("{}\n"sv, (*Result)[I].first.get<double>());
176
0
        break;
177
0
      case TypeCode::V128:
178
0
        fmt::print("{}\n"sv, uint128((*Result)[I].first.get<uint128_t>()));
179
0
        break;
180
0
      case TypeCode::Ref: {
181
0
        if ((*Result)[I].second.isFuncRefType()) {
182
0
          fmt::print("<funcref>\n"sv);
183
0
        } else if ((*Result)[I].second.isExternRefType()) {
184
0
          fmt::print("<externref>\n"sv);
185
0
        } else {
186
0
          fmt::print("<anyref>\n"sv);
187
0
        }
188
0
        break;
189
0
      }
190
0
      case TypeCode::RefNull: {
191
0
        if ((*Result)[I].second.isFuncRefType()) {
192
0
          fmt::print("<null funcref>\n"sv);
193
0
        } else if ((*Result)[I].second.isExternRefType()) {
194
0
          fmt::print("<null externref>\n"sv);
195
0
        } else {
196
0
          fmt::print("<null anyref>\n"sv);
197
0
        }
198
0
        break;
199
0
      }
200
0
      default:
201
0
        break;
202
0
      }
203
0
    }
204
0
    return EXIT_SUCCESS;
205
0
  } else {
206
    // It indicates that the execution of wasm has been aborted.
207
0
    return 128 + SIGABRT;
208
0
  }
209
0
}
210
211
static int
212
ToolOnComponent(WasmEdge::VM::VM &VM, const std::string &FuncName,
213
                std::optional<std::chrono::system_clock::time_point> Timeout,
214
                struct DriverToolOptions &Opt,
215
0
                const AST::Component::FuncType &FuncType) noexcept {
216
0
  std::vector<ComponentValVariant> FuncArgs;
217
0
  std::vector<ComponentValType> FuncArgTypes;
218
219
0
  const size_t Expected = FuncType.getParamList().size();
220
0
  const size_t Got = Opt.Args.value().size() - 1;
221
0
  if (Got < Expected) {
222
0
    spdlog::error("function `{}` expects {} argument(s), got {}"sv, FuncName,
223
0
                  Expected, Got);
224
0
    return EXIT_FAILURE;
225
0
  }
226
227
0
  for (size_t I = 0;
228
0
       I < FuncType.getParamList().size() && I + 1 < Opt.Args.value().size();
229
0
       ++I) {
230
0
    const auto TCode = FuncType.getParamList()[I].getValType().getCode();
231
0
    const auto &ArgValue = Opt.Args.value()[I + 1];
232
233
0
    switch (TCode) {
234
0
    case ComponentTypeCode::S32: {
235
0
      if (!parseNumericArg(
236
0
              ArgValue, I, "s32"sv,
237
0
              [](const std::string &S) {
238
0
                return ValVariant(static_cast<uint32_t>(std::stol(S)));
239
0
              },
240
0
              FuncArgs, FuncArgTypes, TCode)) {
241
0
        return EXIT_FAILURE;
242
0
      }
243
0
      break;
244
0
    }
245
0
    case ComponentTypeCode::U32: {
246
0
      if (!parseNumericArg(
247
0
              ArgValue, I, "u32"sv,
248
0
              [](const std::string &S) {
249
0
                return ValVariant(static_cast<uint32_t>(std::stol(S)));
250
0
              },
251
0
              FuncArgs, FuncArgTypes, TCode)) {
252
0
        return EXIT_FAILURE;
253
0
      }
254
0
      break;
255
0
    }
256
0
    case ComponentTypeCode::S64: {
257
0
      if (!parseNumericArg(
258
0
              ArgValue, I, "s64"sv,
259
0
              [](const std::string &S) {
260
0
                return ValVariant(static_cast<uint64_t>(std::stoll(S)));
261
0
              },
262
0
              FuncArgs, FuncArgTypes, TCode)) {
263
0
        return EXIT_FAILURE;
264
0
      }
265
0
      break;
266
0
    }
267
0
    case ComponentTypeCode::U64: {
268
0
      if (!parseNumericArg(
269
0
              ArgValue, I, "u64"sv,
270
0
              [](const std::string &S) {
271
0
                return ValVariant(static_cast<uint64_t>(std::stoll(S)));
272
0
              },
273
0
              FuncArgs, FuncArgTypes, TCode)) {
274
0
        return EXIT_FAILURE;
275
0
      }
276
0
      break;
277
0
    }
278
0
    case ComponentTypeCode::F32: {
279
0
      if (!parseNumericArg(
280
0
              ArgValue, I, "f32"sv,
281
0
              [](const std::string &S) { return ValVariant(std::stof(S)); },
282
0
              FuncArgs, FuncArgTypes, TCode)) {
283
0
        return EXIT_FAILURE;
284
0
      }
285
0
      break;
286
0
    }
287
0
    case ComponentTypeCode::F64: {
288
0
      if (!parseNumericArg(
289
0
              ArgValue, I, "f64"sv,
290
0
              [](const std::string &S) { return ValVariant(std::stod(S)); },
291
0
              FuncArgs, FuncArgTypes, TCode)) {
292
0
        return EXIT_FAILURE;
293
0
      }
294
0
      break;
295
0
    }
296
0
    case ComponentTypeCode::String: {
297
0
      const std::string Value = Opt.Args.value()[I + 1];
298
0
      FuncArgs.emplace_back(Value);
299
0
      FuncArgTypes.emplace_back(TCode);
300
0
      break;
301
0
    }
302
    // TODO: COMPONENT - other types.
303
0
    default:
304
0
      break;
305
0
    }
306
0
  }
307
0
  if (FuncType.getParamList().size() + 1 < Opt.Args.value().size()) {
308
0
    for (size_t I = FuncType.getParamList().size() + 1;
309
0
         I < Opt.Args.value().size(); ++I) {
310
0
      if (!parseNumericArg(
311
0
              Opt.Args.value()[I], I, "u64"sv,
312
0
              [](const std::string &S) {
313
0
                return ValVariant(static_cast<uint64_t>(std::stoll(S)));
314
0
              },
315
0
              FuncArgs, FuncArgTypes, ComponentTypeCode::U64)) {
316
0
        return EXIT_FAILURE;
317
0
      }
318
0
    }
319
0
  }
320
321
0
  auto AsyncResult = VM.asyncExecuteComponent(FuncName, FuncArgs, FuncArgTypes);
322
0
  if (Timeout.has_value()) {
323
0
    if (!AsyncResult.waitUntil(*Timeout)) {
324
0
      AsyncResult.cancel();
325
0
    }
326
0
  }
327
0
  if (auto Result = AsyncResult.get()) {
328
    // Print results.
329
0
    for (auto &&Val : *Result) {
330
0
      switch (Val.second.getCode()) {
331
0
      case ComponentTypeCode::S32:
332
0
        fmt::print("{}\n"sv, std::get<ValVariant>(Val.first).get<int32_t>());
333
0
        break;
334
0
      case ComponentTypeCode::U32:
335
0
        fmt::print("{}\n"sv, std::get<ValVariant>(Val.first).get<uint32_t>());
336
0
        break;
337
0
      case ComponentTypeCode::S64:
338
0
        fmt::print("{}\n"sv, std::get<ValVariant>(Val.first).get<int64_t>());
339
0
        break;
340
0
      case ComponentTypeCode::U64:
341
0
        fmt::print("{}\n"sv, std::get<ValVariant>(Val.first).get<uint64_t>());
342
0
        break;
343
0
      case ComponentTypeCode::F32:
344
0
        fmt::print("{}\n"sv, std::get<ValVariant>(Val.first).get<float>());
345
0
        break;
346
0
      case ComponentTypeCode::F64:
347
0
        fmt::print("{}\n"sv, std::get<ValVariant>(Val.first).get<double>());
348
0
        break;
349
0
      case ComponentTypeCode::String:
350
0
        fmt::print("{}\n"sv, std::get<std::string>(Val.first));
351
0
        break;
352
0
      default:
353
0
        break;
354
0
      }
355
0
    }
356
357
0
    return EXIT_SUCCESS;
358
0
  } else {
359
    // It indicates that the execution of wasm has been aborted.
360
0
    return 128 + SIGABRT;
361
0
  }
362
0
}
363
364
0
int Tool(struct DriverToolOptions &Opt) noexcept {
365
0
  std::ios::sync_with_stdio(false);
366
367
0
  Configure Conf = createConfigure(Opt);
368
369
0
  std::optional<std::chrono::system_clock::time_point> Timeout;
370
0
  if (Opt.TimeLim.value() > 0) {
371
0
    Timeout = std::chrono::system_clock::now() +
372
0
              std::chrono::milliseconds(Opt.TimeLim.value());
373
0
  }
374
0
  if (Opt.GasLim.value().size() > 0) {
375
0
    Conf.getStatisticsConfigure().setCostMeasuring(true);
376
0
    Conf.getStatisticsConfigure().setCostLimit(
377
0
        static_cast<uint32_t>(Opt.GasLim.value().back()));
378
0
  }
379
0
  if (Opt.MemLim.value().size() > 0) {
380
0
    Conf.getRuntimeConfigure().setMaxMemoryPage(
381
0
        static_cast<uint32_t>(Opt.MemLim.value().back()));
382
0
  }
383
0
  if (Opt.ConfEnableAllStatistics.value()) {
384
0
    Conf.getStatisticsConfigure().setInstructionCounting(true);
385
0
    Conf.getStatisticsConfigure().setCostMeasuring(true);
386
0
    Conf.getStatisticsConfigure().setTimeMeasuring(true);
387
0
  } else {
388
0
    if (Opt.ConfEnableInstructionCounting.value()) {
389
0
      Conf.getStatisticsConfigure().setInstructionCounting(true);
390
0
    }
391
0
    if (Opt.ConfEnableGasMeasuring.value()) {
392
0
      Conf.getStatisticsConfigure().setCostMeasuring(true);
393
0
    }
394
0
    if (Opt.ConfEnableTimeMeasuring.value()) {
395
0
      Conf.getStatisticsConfigure().setTimeMeasuring(true);
396
0
    }
397
0
  }
398
  // Determine the effective run mode.
399
  // Precedence: --run-mode > deprecated --enable-jit / --force-interpreter.
400
0
  RunMode RunModeFromFlag = RunMode::Interpreter;
401
0
  if (!Opt.ConfRunMode.value().empty()) {
402
0
    if (Opt.ConfEnableJIT.value() || Opt.ConfForceInterpreter.value()) {
403
0
      spdlog::warn("--run-mode overrides deprecated --enable-jit / "
404
0
                   "--force-interpreter."sv);
405
0
    }
406
0
    if (auto Mode = parseRunModeArg(Opt.ConfRunMode.value())) {
407
0
      RunModeFromFlag = *Mode;
408
0
    } else {
409
0
      spdlog::warn("Unknown --run-mode value: \"{}\"; using interpreter. "
410
0
                   "Valid values: interpreter, jit, aot, lazyjit."sv,
411
0
                   Opt.ConfRunMode.value());
412
0
      RunModeFromFlag = RunMode::Interpreter;
413
0
    }
414
0
  } else if (Opt.ConfEnableJIT.value()) {
415
0
    spdlog::warn("--enable-jit is deprecated, use --run-mode=jit instead."sv);
416
0
    RunModeFromFlag = RunMode::JIT;
417
0
  } else if (Opt.ConfForceInterpreter.value()) {
418
0
    spdlog::warn("--force-interpreter is deprecated, use "
419
0
                 "--run-mode=interpreter instead."sv);
420
0
    RunModeFromFlag = RunMode::Interpreter;
421
0
  }
422
0
  Conf.getRuntimeConfigure().setRunMode(RunModeFromFlag);
423
0
  if (RunModeFromFlag == RunMode::JIT || RunModeFromFlag == RunMode::LazyJIT) {
424
0
    Conf.getCompilerConfigure().setOptimizationLevel(
425
0
        WasmEdge::CompilerConfigure::OptimizationLevel::O1);
426
0
  }
427
0
  if (Opt.ConfEnableCoredump.value()) {
428
0
    Conf.getRuntimeConfigure().setEnableCoredump(true);
429
0
  }
430
0
  if (Opt.ConfCoredumpWasmgdb.value()) {
431
0
    Conf.getRuntimeConfigure().setCoredumpWasmgdb(true);
432
0
  }
433
0
  if (Opt.ConfAFUNIX.value()) {
434
0
    Conf.getRuntimeConfigure().setAllowAFUNIX(true);
435
0
  }
436
437
0
  Conf.addHostRegistration(HostRegistration::Wasi);
438
0
  const auto InputPath =
439
0
      std::filesystem::absolute(std::filesystem::u8path(Opt.SoName.value()));
440
441
  // Create VM and get WASI module instance.
442
0
  VM::VM VM(Conf);
443
0
  Host::WasiModule *WasiMod = dynamic_cast<Host::WasiModule *>(
444
0
      VM.getImportModule(HostRegistration::Wasi));
445
446
0
  for (const auto &ModEntry : Opt.LinkedModules.value()) {
447
0
    auto Pos = ModEntry.find(':');
448
0
    if (Pos == std::string::npos) {
449
0
      spdlog::error("Invalid --module format: \"{}\". Expected name:path."sv,
450
0
                    ModEntry);
451
0
      return EXIT_FAILURE;
452
0
    }
453
0
    auto Name = ModEntry.substr(0, Pos);
454
0
    auto Path = std::filesystem::absolute(
455
0
        std::filesystem::u8path(ModEntry.substr(Pos + 1)));
456
0
    if (auto Result = VM.registerModule(Name, Path); !Result) {
457
0
      spdlog::error("Failed to register module \"{}\" from: {}"sv, Name,
458
0
                    Path.u8string());
459
0
      return EXIT_FAILURE;
460
0
    }
461
0
  }
462
463
  // Load, validate, and instantiate WASM or Component.
464
0
  if (auto Result = VM.loadWasm(InputPath.u8string()); !Result) {
465
0
    return EXIT_FAILURE;
466
0
  }
467
0
  if (auto Result = VM.validate(); !Result) {
468
0
    return EXIT_FAILURE;
469
0
  }
470
0
  if (auto Result = VM.instantiate(); !Result) {
471
0
    return EXIT_FAILURE;
472
0
  }
473
474
0
  auto HasValidCommandModStartFunc = [&]() {
475
0
    bool HasStart = false;
476
0
    bool Valid = false;
477
478
0
    auto Functions = VM.getFunctionList();
479
0
    for (auto &[FuncName, Type] : Functions) {
480
0
      if (FuncName == "_start") {
481
0
        HasStart = true;
482
0
        if (Type.getReturnTypes().size() == 0 &&
483
0
            Type.getParamTypes().size() == 0) {
484
0
          Valid = true;
485
0
          break;
486
0
        }
487
0
      }
488
0
    }
489
490
    // If HasStart is true but Valid is false, insert _start to enter reactor
491
    // mode.
492
0
    if (HasStart && !Valid) {
493
0
      Opt.Args.value().insert(Opt.Args.value().begin(), "_start");
494
0
    }
495
496
0
    return HasStart && Valid;
497
0
  };
498
499
  // TODO: COMPONENT - does component start function named as "_start"?
500
0
  bool EnterCommandMode = !Opt.Reactor.value() && HasValidCommandModStartFunc();
501
502
  // Initialize WASI module.
503
0
  WasiMod->init(Opt.Dir.value(),
504
0
                InputPath.filename()
505
0
                    .replace_extension(std::filesystem::u8path("wasm"sv))
506
0
                    .u8string(),
507
0
                Opt.Args.value(), Opt.Env.value());
508
509
0
  if (EnterCommandMode) {
510
    // command mode
511
512
    // TODO: COMPONENT - currently not supported.
513
0
    auto AsyncResult = VM.asyncExecute("_start"sv);
514
0
    if (Timeout.has_value()) {
515
0
      if (!AsyncResult.waitUntil(*Timeout)) {
516
0
        AsyncResult.cancel();
517
0
      }
518
0
    }
519
0
    if (auto Result = AsyncResult.get();
520
0
        Result || Result.error() == ErrCode::Value::Terminated) {
521
0
      return static_cast<int>(WasiMod->getExitCode());
522
0
    } else {
523
      // It indicates that the execution of wasm has been aborted.
524
0
      return 128 + SIGABRT;
525
0
    }
526
0
  } else {
527
    // reactor mode
528
529
    // Get the function name to invoke.
530
0
    if (Opt.Args.value().empty()) {
531
0
      fmt::print(
532
0
          stderr,
533
0
          "A function name is required when reactor mode is enabled.\n"sv);
534
0
      return EXIT_FAILURE;
535
0
    }
536
0
    const auto &FuncName = Opt.Args.value().front();
537
538
0
    if (VM.holdsModule()) {
539
      // WASM case.
540
541
      // Check the exported function name and function type first.
542
0
      const auto InitFunc = "_initialize"s;
543
0
      bool HasInit = false;
544
0
      const AST::FunctionType *FuncType = nullptr;
545
0
      for (const auto &Func : VM.getFunctionList()) {
546
0
        if (Func.first == InitFunc) {
547
          // Found the init function.
548
0
          HasInit = true;
549
0
        }
550
0
        if (Func.first == FuncName) {
551
          // Found the function to invoke.
552
0
          FuncType = &Func.second;
553
0
        }
554
0
      }
555
556
0
      if (FuncType == nullptr) {
557
0
        fmt::print(stderr,
558
0
                   "Function \"{}\" not found in the module export list.\n"sv,
559
0
                   FuncName);
560
0
        return EXIT_FAILURE;
561
0
      }
562
563
      // If the initialize function was found and is not being called
564
      // explicitly, invoke it first.
565
0
      if (HasInit && FuncName != InitFunc) {
566
0
        auto AsyncResult = VM.asyncExecute(InitFunc);
567
0
        if (Timeout.has_value()) {
568
0
          if (!AsyncResult.waitUntil(*Timeout)) {
569
0
            AsyncResult.cancel();
570
0
          }
571
0
        }
572
0
        if (auto Result = AsyncResult.get(); unlikely(!Result)) {
573
          // It indicates that the execution of wasm has been aborted.
574
0
          return 128 + SIGABRT;
575
0
        }
576
0
      }
577
0
      return ToolOnModule(VM, FuncName, Timeout, Opt, *FuncType);
578
0
    } else if (VM.holdsComponent()) {
579
      // Component case.
580
581
      // Check the exported function name and function type first.
582
0
      const AST::Component::FuncType *FuncType = nullptr;
583
0
      for (const auto &Func : VM.getComponentFunctionList()) {
584
0
        if (Func.first == FuncName) {
585
          // Found the function to invoke.
586
0
          FuncType = &Func.second;
587
0
        }
588
0
      }
589
0
      if (FuncType == nullptr) {
590
0
        fmt::print(
591
0
            stderr,
592
0
            "Function \"{}\" not found in the component export list.\n"sv,
593
0
            FuncName);
594
0
        return EXIT_FAILURE;
595
0
      }
596
0
      return ToolOnComponent(VM, FuncName, Timeout, Opt, *FuncType);
597
0
    } else {
598
      // which means VM has neither instantiated module nor instantiated
599
      // component
600
      return 128 + SIGABRT;
601
0
    }
602
0
  }
603
0
}
604
605
} // namespace Driver
606
} // namespace WasmEdge