diff options
author | Alon Zakai <azakai@google.com> | 2021-09-10 09:39:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-10 09:39:10 -0700 |
commit | 3ed93d00b8f7c0d1f4ab2086b386836f2914dc0e (patch) | |
tree | 0511118fad9439fe6995ff0fe1e67b3231b67c14 /src/wasm/wasm-validator.cpp | |
parent | 23e452a5c89cc520a1d08bb465785bcb79a43baa (diff) | |
download | binaryen-3ed93d00b8f7c0d1f4ab2086b386836f2914dc0e.tar.gz binaryen-3ed93d00b8f7c0d1f4ab2086b386836f2914dc0e.tar.bz2 binaryen-3ed93d00b8f7c0d1f4ab2086b386836f2914dc0e.zip |
[Wasm GC] ArrayInit support (#4138)
array.init is like array.new_with_rtt except that it takes
as arguments the values to initialize the array with (as opposed to
a size and an optional initial value).
Spec: https://docs.google.com/document/d/1afthjsL_B9UaMqCA5ekgVmOm75BVFu6duHNsN9-gnXw/edit#
Diffstat (limited to 'src/wasm/wasm-validator.cpp')
-rw-r--r-- | src/wasm/wasm-validator.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 450a7b956..eaeea7f1a 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -382,6 +382,7 @@ public: void visitStructGet(StructGet* curr); void visitStructSet(StructSet* curr); void visitArrayNew(ArrayNew* curr); + void visitArrayInit(ArrayInit* curr); void visitArrayGet(ArrayGet* curr); void visitArraySet(ArraySet* curr); void visitArrayLen(ArrayLen* curr); @@ -2416,6 +2417,31 @@ void FunctionValidator::visitArrayNew(ArrayNew* curr) { } } +void FunctionValidator::visitArrayInit(ArrayInit* curr) { + shouldBeTrue(getModule()->features.hasGC(), + curr, + "array.init requires gc to be enabled"); + if (curr->type == Type::unreachable) { + return; + } + if (!shouldBeTrue( + curr->rtt->type.isRtt(), curr, "array.init rtt must be rtt")) { + return; + } + auto heapType = curr->rtt->type.getHeapType(); + if (!shouldBeTrue( + heapType.isArray(), curr, "array.init heap type must be array")) { + return; + } + const auto& element = heapType.getArray().element; + for (auto* value : curr->values) { + shouldBeSubType(value->type, + element.type, + curr, + "array.init value must have proper type"); + } +} + void FunctionValidator::visitArrayGet(ArrayGet* curr) { shouldBeTrue( getModule()->features.hasGC(), curr, "array.get requires gc to be enabled"); |