Skip to content

Add test for native to wasm value conversions#525

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

Add test for native to wasm value conversions#525
leonm1 wants to merge 13 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
template <> auto convertArgToValTypePtr<int64_t>() { return wasm_valtype_new_i64(); };
template <> auto convertArgToValTypePtr<uint64_t>() { return wasm_valtype_new_i64(); };
template <> auto convertArgToValTypePtr<double>() { return wasm_valtype_new_f64(); };
template <> auto convertArgToValTypePtr<float>() { return wasm_valtype_new_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.

class ArgPassingContext : public TestContext {
public:
using TestContext::TestContext;
WasmResult getHeaderMapPairs(WasmHeaderMapType /* type */, Pairs * /* result */) override {
Copy link
Member

Choose a reason for hiding this comment

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

Maybe use getStatus to get uint32, string pair and test both in one go?

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