diff options
author | Alon Zakai <azakai@google.com> | 2021-02-01 22:44:40 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-01 14:44:40 -0800 |
commit | eafb0a4ef25cd82317ac8fa84a9d7e58f9382fcc (patch) | |
tree | 7284b2c93d1416dd898f297792fc00a11dac0ed7 /src/wasm/wasm-stack.cpp | |
parent | 02f8c56aad18a2715904d1d5e0951b25bf7749c3 (diff) | |
download | binaryen-eafb0a4ef25cd82317ac8fa84a9d7e58f9382fcc.tar.gz binaryen-eafb0a4ef25cd82317ac8fa84a9d7e58f9382fcc.tar.bz2 binaryen-eafb0a4ef25cd82317ac8fa84a9d7e58f9382fcc.zip |
[GC] br_on_null (#3528)
This is only partial support, as br_on_null also has an extra optional
value in the spec. Implementing that is cumbersome in binaryen, and
there is ongoing spec discussions about it (see
https://github.com/WebAssembly/function-references/issues/45 ), so
for now we only support the simple case without the default value.
Also fix prefixed opcodes to be LEBs in RefAs, which was noticed here
as the change here made it noticeable whether the values were int8 or
LEBs.
Diffstat (limited to 'src/wasm/wasm-stack.cpp')
-rw-r--r-- | src/wasm/wasm-stack.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 003d2b7af..d42080bac 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -1982,19 +1982,21 @@ void BinaryInstWriter::visitRefCast(RefCast* curr) { } void BinaryInstWriter::visitBrOn(BrOn* curr) { - o << int8_t(BinaryConsts::GCPrefix); switch (curr->op) { + case BrOnNull: + o << int8_t(BinaryConsts::BrOnNull); + break; case BrOnCast: - o << U32LEB(BinaryConsts::BrOnCast); + o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnCast); break; case BrOnFunc: - o << U32LEB(BinaryConsts::BrOnFunc); + o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnFunc); break; case BrOnData: - o << U32LEB(BinaryConsts::BrOnData); + o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnData); break; case BrOnI31: - o << U32LEB(BinaryConsts::BrOnI31); + o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnI31); break; default: WASM_UNREACHABLE("invalid br_on_*"); @@ -2085,13 +2087,13 @@ void BinaryInstWriter::visitRefAs(RefAs* curr) { o << int8_t(BinaryConsts::RefAsNonNull); break; case RefAsFunc: - o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::RefAsFunc); + o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RefAsFunc); break; case RefAsData: - o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::RefAsData); + o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RefAsData); break; case RefAsI31: - o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::RefAsI31); + o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RefAsI31); break; default: WASM_UNREACHABLE("invalid ref.as_*"); |