MCPcopy Create free account
hub / github.com/WasmEdge/WasmEdge / parseValueList

Function parseValueList

test/spec/spectest.cpp:120–195  ·  view source on GitHub ↗

Helper function to parse parameters from JSON to a vector of values.

Source from the content-addressed store, hash-verified

118
119// Helper function to parse parameters from JSON to a vector of values.
120std::pair<std::vector<WasmEdge::ValVariant>, std::vector<WasmEdge::ValType>>
121parseValueList(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))));

Callers 1

processCommandsMethod · 0.85

Calls 3

RefVariantClass · 0.85
sizeMethod · 0.45
typeMethod · 0.45

Tested by

no test coverage detected