summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-validator.cpp
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2020-12-07 16:58:43 -0800
committerGitHub <noreply@github.com>2020-12-07 16:58:43 -0800
commita84898c11df3d93fb69365fb274a9bb06d60ed47 (patch)
treec2bc444354ec5731dccb090e5437f00840bf7d9a /src/wasm/wasm-validator.cpp
parent72a7881b42ebed6b2ef36e912a8f5937106e5824 (diff)
downloadbinaryen-a84898c11df3d93fb69365fb274a9bb06d60ed47.tar.gz
binaryen-a84898c11df3d93fb69365fb274a9bb06d60ed47.tar.bz2
binaryen-a84898c11df3d93fb69365fb274a9bb06d60ed47.zip
[GC] Add struct.set (#3430)
Mostly straightforward after struct.get. This renames the value field in struct.get to ref. I think this makes more sense because struct.set has both a reference to a thing, and a value to set onto that thing. So calling the former ref seems more consistent, giving us ref, value. This mirrors load/store for example where we use ptr, value, and ref is playing the role of ptr here basically.
Diffstat (limited to 'src/wasm/wasm-validator.cpp')
-rw-r--r--src/wasm/wasm-validator.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index 9a8644b28..b2e208d53 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -2231,8 +2231,8 @@ void FunctionValidator::visitStructGet(StructGet* curr) {
shouldBeTrue(getModule()->features.hasGC(),
curr,
"struct.get requires gc to be enabled");
- if (curr->value->type != Type::unreachable) {
- const auto& fields = curr->value->type.getHeapType().getStruct().fields;
+ if (curr->ref->type != Type::unreachable) {
+ const auto& fields = curr->ref->type.getHeapType().getStruct().fields;
shouldBeTrue(curr->index < fields.size(), curr, "bad struct.get field");
shouldBeEqual(curr->type,
fields[curr->index].type,
@@ -2245,7 +2245,14 @@ void FunctionValidator::visitStructSet(StructSet* curr) {
shouldBeTrue(getModule()->features.hasGC(),
curr,
"struct.set requires gc to be enabled");
- WASM_UNREACHABLE("TODO (gc): struct.set");
+ if (curr->ref->type != Type::unreachable) {
+ const auto& fields = curr->ref->type.getHeapType().getStruct().fields;
+ shouldBeTrue(curr->index < fields.size(), curr, "bad struct.get field");
+ shouldBeEqual(curr->value->type,
+ fields[curr->index].type,
+ curr,
+ "struct.set must have the proper type");
+ }
}
void FunctionValidator::visitArrayNew(ArrayNew* curr) {