Skip to content

Add test for native to wasm value conversions#525

Open
leonm1 wants to merge 15 commits intoproxy-wasm:mainfrom
leonm1:test/bigendian-values
Open

Add test for native to wasm value conversions#525
leonm1 wants to merge 15 commits intoproxy-wasm:mainfrom
leonm1:test/bigendian-values

Conversation

@leonm1
Copy link
Contributor

@leonm1 leonm1 commented Mar 17, 2026

This test explicitly tests the bounds of various native and wasm types to ensure passing data across the ABI boundary is not lossy.

Signed-off-by: Matt Leon <mattleon@google.com>
Copy link
Member

@PiotrSikora PiotrSikora left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you change bigendian to endianness everywhere? We're verifying that values are not incorrectly converted on little-endian systems as well.

leonm1 added 12 commits March 17, 2026 14:40
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
There's enough test cases that this warrants being run in parallel via its own test target.

Signed-off-by: Matt Leon <mattleon@google.com>
Uses bswap64 by default to handle int64 and uint64 values.

For float and doubles, uses appropriate-size bswap operators by first
bit-casting floats and doubles to their same-size int types. Otherwise,
they will be coerced to an int type before conversion and be returned as
int values.

Signed-off-by: Matt Leon <mattleon@google.com>
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>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1 leonm1 requested a review from PiotrSikora March 19, 2026 15:32
Signed-off-by: Matt Leon <mattleon@google.com>
src/wamr/wamr.cc Outdated
}
template <> Word convertValueTypeToArg<Word>(wasm_val_t val) { return val.of.i32; }
template <> Word convertValueTypeToArg<Word>(wasm_val_t val) {
return std::bit_cast<uint32_t>(val.of.i32);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we use static_cast here to be consistent with the surrounding code?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1 leonm1 requested a review from PiotrSikora March 20, 2026 18:52
Copy link
Member

@PiotrSikora PiotrSikora left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, sans the remaining nits.

template <> constexpr auto convertArgToValKind<int64_t>() { return wasm::ValKind::I64; };
template <> constexpr auto convertArgToValKind<uint64_t>() { return wasm::ValKind::I64; };
template <> constexpr auto convertArgToValKind<double>() { return wasm::ValKind::F64; };
template <> constexpr auto convertArgToValKind<float>() { return wasm::ValKind::F32; };
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: order.

return WasmEdge_ValueGenI64(static_cast<int64_t>(t));
}
template <> WasmEdge_Value makeVal(double t) { return WasmEdge_ValueGenF64(t); }
template <> WasmEdge_Value makeVal(float t) { return WasmEdge_ValueGenF32(t); }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: order.

pub extern "C" fn test_return_u64(_: f32) -> u64 {
return 11111111111111111111;
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add test_return_i64 for completness?

Comment on lines +61 to +62
name = "arg_passing.wasm",
srcs = ["arg_passing.rs"],
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be really called endianness (not a blocker, just saying...).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants