Helper function to parse parameters from JSON to a vector of values.
| 118 | |
| 119 | // Helper function to parse parameters from JSON to a vector of values. |
| 120 | std::pair<std::vector<WasmEdge::ValVariant>, std::vector<WasmEdge::ValType>> |
| 121 | parseValueList(const simdjson::dom::array &Args) { |
| 122 | std::vector<WasmEdge::ValVariant> Result; |
| 123 | std::vector<WasmEdge::ValType> ResultTypes; |
| 124 | Result.reserve(Args.size()); |
| 125 | ResultTypes.reserve(Args.size()); |
| 126 | for (const simdjson::dom::object &Element : Args) { |
| 127 | std::string_view Type = Element["type"]; |
| 128 | simdjson::dom::element Value = Element["value"]; |
| 129 | if (Value.type() == simdjson::dom::element_type::ARRAY) { |
| 130 | simdjson::dom::array ValueNodeArray = Value; |
| 131 | WasmEdge::uint128_t V128; |
| 132 | std::string_view LaneType = Element["lane_type"]; |
| 133 | if (LaneType == "i64"sv || LaneType == "f64"sv) { |
| 134 | parseSIMDLanes<uint64_t>(V128, ValueNodeArray); |
| 135 | } else if (LaneType == "i32"sv || LaneType == "f32"sv) { |
| 136 | parseSIMDLanes<uint32_t>(V128, ValueNodeArray); |
| 137 | } else if (LaneType == "i16"sv) { |
| 138 | parseSIMDLanes<uint16_t>(V128, ValueNodeArray); |
| 139 | } else if (LaneType == "i8"sv) { |
| 140 | parseSIMDLanes<uint8_t>(V128, ValueNodeArray); |
| 141 | } else { |
| 142 | assumingUnreachable(); |
| 143 | } |
| 144 | Result.emplace_back(V128); |
| 145 | ResultTypes.emplace_back(WasmEdge::TypeCode::V128); |
| 146 | } else if (Value.type() == simdjson::dom::element_type::STRING) { |
| 147 | std::string_view ValueStr = Value; |
| 148 | if (Type == "externref"sv || Type == "anyref"sv) { |
| 149 | WasmEdge::TypeCode Code = Type == "externref"sv |
| 150 | ? WasmEdge::TypeCode::ExternRef |
| 151 | : WasmEdge::TypeCode::AnyRef; |
| 152 | if (Value == "null"sv) { |
| 153 | Result.emplace_back(WasmEdge::RefVariant(Code)); |
| 154 | } else { |
| 155 | // ExternRef and AnyRef are non-opaque references. Add 0x1 uint32_t |
| 156 | // prefix in this case to present non-null. |
| 157 | Result.emplace_back(WasmEdge::RefVariant( |
| 158 | Code, reinterpret_cast<void *>(std::stoul(std::string(ValueStr)) + |
| 159 | 0x100000000ULL))); |
| 160 | } |
| 161 | ResultTypes.emplace_back(Code); |
| 162 | } else if (Type == "funcref"sv) { |
| 163 | if (Value == "null"sv) { |
| 164 | Result.emplace_back( |
| 165 | WasmEdge::RefVariant(WasmEdge::TypeCode::FuncRef)); |
| 166 | } else { |
| 167 | // Input values of opaque references are not supported for testing. |
| 168 | assumingUnreachable(); |
| 169 | } |
| 170 | ResultTypes.emplace_back(WasmEdge::TypeCode::FuncRef); |
| 171 | } else if (Type == "i32"sv) { |
| 172 | Result.emplace_back( |
| 173 | static_cast<uint32_t>(std::stoul(std::string(ValueStr)))); |
| 174 | ResultTypes.emplace_back(WasmEdge::TypeCode::I32); |
| 175 | } else if (Type == "f32"sv) { |
| 176 | Result.emplace_back( |
| 177 | static_cast<uint32_t>(std::stoul(std::string(ValueStr)))); |
no test coverage detected