Skip to content

Commit bf28c18

Browse files
committed
Fix high bits stored in uint64 representation of Word
Without first converting to uint32_t, the getters for wasm_val_t for wamr, wasmtime, and wasmedge returned a signed integer type. For uint32 values high enough to be in the negative range, sign extension would be applied when the value was coerced into proxy_wasm::Word. This resulted in Word values that did not match the comment on Word ``` // Represents a Wasm-native word-sized datum. On 32-bit VMs, the high bits are always zero. // The Wasm/VM API treats all bits as significant. ``` nor the exact value returned from the wasm plugin. Signed-off-by: Matt Leon <mattleon@google.com>
1 parent 23f7c36 commit bf28c18

3 files changed

Lines changed: 12 additions & 4 deletions

File tree

src/wamr/wamr.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,18 +489,21 @@ template <> auto convertArgToValTypePtr<Word>() { return wasm_valtype_new_i32();
489489
template <> auto convertArgToValTypePtr<uint32_t>() { return wasm_valtype_new_i32(); };
490490
template <> auto convertArgToValTypePtr<int64_t>() { return wasm_valtype_new_i64(); };
491491
template <> auto convertArgToValTypePtr<uint64_t>() { return wasm_valtype_new_i64(); };
492-
template <> auto convertArgToValTypePtr<double>() { return wasm_valtype_new_f64(); };
493492
template <> auto convertArgToValTypePtr<float>() { return wasm_valtype_new_f32(); };
493+
template <> auto convertArgToValTypePtr<double>() { return wasm_valtype_new_f64(); };
494494

495495
template <typename T> T convertValueTypeToArg(wasm_val_t val);
496496
template <> uint32_t convertValueTypeToArg<uint32_t>(wasm_val_t val) {
497497
return static_cast<uint32_t>(val.of.i32);
498498
}
499-
template <> Word convertValueTypeToArg<Word>(wasm_val_t val) { return val.of.i32; }
499+
template <> Word convertValueTypeToArg<Word>(wasm_val_t val) {
500+
return std::bit_cast<uint32_t>(val.of.i32);
501+
}
500502
template <> int64_t convertValueTypeToArg<int64_t>(wasm_val_t val) { return val.of.i64; }
501503
template <> uint64_t convertValueTypeToArg<uint64_t>(wasm_val_t val) {
502504
return static_cast<uint64_t>(val.of.i64);
503505
}
506+
template <> float convertValueTypeToArg<float>(wasm_val_t val) { return val.of.f32; }
504507
template <> double convertValueTypeToArg<double>(wasm_val_t val) { return val.of.f64; }
505508

506509
template <typename T, typename U, std::size_t... I>

src/wasmedge/wasmedge.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,16 @@ template <typename T> T convValTypeToArg(WasmEdge_Value val);
152152
template <> uint32_t convValTypeToArg<uint32_t>(WasmEdge_Value val) {
153153
return static_cast<uint32_t>(WasmEdge_ValueGetI32(val));
154154
}
155-
template <> Word convValTypeToArg<Word>(WasmEdge_Value val) { return WasmEdge_ValueGetI32(val); }
155+
template <> Word convValTypeToArg<Word>(WasmEdge_Value val) {
156+
return std::bit_cast<uint32_t>(WasmEdge_ValueGetI32(val));
157+
}
156158
template <> int64_t convValTypeToArg<int64_t>(WasmEdge_Value val) {
157159
return WasmEdge_ValueGetI64(val);
158160
}
159161
template <> uint64_t convValTypeToArg<uint64_t>(WasmEdge_Value val) {
160162
return static_cast<uint64_t>(WasmEdge_ValueGetI64(val));
161163
}
164+
template <> float convValTypeToArg<float>(WasmEdge_Value val) { return WasmEdge_ValueGetF32(val); }
162165
template <> double convValTypeToArg<double>(WasmEdge_Value val) {
163166
return WasmEdge_ValueGetF64(val);
164167
}

src/wasmtime/wasmtime.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,9 @@ template <typename T> T convertValueTypeToArg(wasm_val_t val);
469469
template <> uint32_t convertValueTypeToArg<uint32_t>(wasm_val_t val) {
470470
return static_cast<uint32_t>(val.of.i32);
471471
}
472-
template <> Word convertValueTypeToArg<Word>(wasm_val_t val) { return val.of.i32; }
472+
template <> Word convertValueTypeToArg<Word>(wasm_val_t val) {
473+
return std::bit_cast<uint32_t>(val.of.i32);
474+
}
473475
template <> int64_t convertValueTypeToArg<int64_t>(wasm_val_t val) { return val.of.i64; }
474476
template <> uint64_t convertValueTypeToArg<uint64_t>(wasm_val_t val) {
475477
return static_cast<uint64_t>(val.of.i64);

0 commit comments

Comments
 (0)