diff options
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r-- | src/wasm-interpreter.h | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 65a4417c8..bf02b7987 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1398,7 +1398,26 @@ public: } Flow visitStructNew(StructNew* curr) { NOTE_ENTER("StructNew"); - WASM_UNREACHABLE("TODO (gc): struct.new"); + auto rtt = this->visit(curr->rtt); + if (rtt.breaking()) { + return rtt; + } + const auto& fields = curr->rtt->type.getHeapType().getStruct().fields; + Literals data; + data.resize(fields.size()); + for (Index i = 0; i < fields.size(); i++) { + if (curr->isWithDefault()) { + data[i] = Literal::makeZero(fields[i].type); + } else { + auto value = this->visit(curr->operands[i]); + if (value.breaking()) { + return value; + } + data[i] = value.getSingleValue(); + } + } + return Flow( + Literal(std::shared_ptr<Literals>(new Literals(data)), curr->type)); } Flow visitStructGet(StructGet* curr) { NOTE_ENTER("StructGet"); |