diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 97dad88bb..12aa5f214 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3547,6 +3547,9 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { if (maybeVisitArrayLen(curr, opcode)) { break; } + if (maybeVisitArrayCopy(curr, opcode)) { + break; + } if (opcode == BinaryConsts::RefIsFunc || opcode == BinaryConsts::RefIsData || opcode == BinaryConsts::RefIsI31) { @@ -6496,6 +6499,24 @@ bool WasmBinaryBuilder::maybeVisitArrayLen(Expression*& out, uint32_t code) { return true; } +bool WasmBinaryBuilder::maybeVisitArrayCopy(Expression*& out, uint32_t code) { + if (code != BinaryConsts::ArrayCopy) { + return false; + } + auto destHeapType = getIndexedHeapType(); + auto srcHeapType = getIndexedHeapType(); + auto* length = popNonVoidExpression(); + auto* srcIndex = popNonVoidExpression(); + auto* srcRef = popNonVoidExpression(); + auto* destIndex = popNonVoidExpression(); + auto* destRef = popNonVoidExpression(); + validateHeapTypeUsingChild(destRef, destHeapType); + validateHeapTypeUsingChild(srcRef, srcHeapType); + out = + Builder(wasm).makeArrayCopy(destRef, destIndex, srcRef, srcIndex, length); + return true; +} + void WasmBinaryBuilder::visitRefAs(RefAs* curr, uint8_t code) { BYN_TRACE("zz node: RefAs\n"); switch (code) { |