diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-binary.h | 11 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 38 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 18 |
3 files changed, 42 insertions, 25 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 8ca07e7d2..326c37bf0 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1250,7 +1250,15 @@ public: Module* getModule() { return wasm; } void writeType(Type type); + + // Writes an arbitrary heap type, which may be indexed or one of the + // basic types like funcref. void writeHeapType(HeapType type); + // Writes an indexed heap type. Note that this is encoded differently than a + // general heap type because it does not allow negative values for basic heap + // types. + void writeIndexedHeapType(HeapType type); + void writeField(const Field& field); private: @@ -1344,8 +1352,9 @@ public: Type getType(); // Get a type given the initial S32LEB has already been read, and is provided. Type getType(int initial); - HeapType getHeapType(); + HeapType getIndexedHeapType(); + Type getConcreteType(); Name getInlineString(); void verifyInt8(int8_t x); diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index dacb6edbb..2eb8bdcde 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -1185,7 +1185,7 @@ void WasmBinaryWriter::writeType(Type type) { } else { o << S32LEB(BinaryConsts::EncodedType::rtt); } - writeHeapType(rtt.heapType); + writeIndexedHeapType(rtt.heapType); return; } int ret = 0; @@ -1267,6 +1267,10 @@ void WasmBinaryWriter::writeHeapType(HeapType type) { o << S64LEB(ret); // TODO: Actually s33 } +void WasmBinaryWriter::writeIndexedHeapType(HeapType type) { + o << U32LEB(getTypeIndex(type)); +} + void WasmBinaryWriter::writeField(const Field& field) { if (field.type == Type::i32 && field.packedType != Field::not_packed) { if (field.packedType == Field::i8) { @@ -1676,6 +1680,14 @@ HeapType WasmBinaryBuilder::getHeapType() { WASM_UNREACHABLE("unexpected type"); } +HeapType WasmBinaryBuilder::getIndexedHeapType() { + auto index = getU32LEB(); + if (index >= types.size()) { + throwError("invalid heap type index: " + std::to_string(index)); + } + return types[index]; +} + Type WasmBinaryBuilder::getConcreteType() { auto type = getType(); if (!type.isConcrete()) { @@ -1789,11 +1801,7 @@ void WasmBinaryBuilder::readTypes() { case BinaryConsts::EncodedType::rtt: { auto depth = typeCode == BinaryConsts::EncodedType::rtt ? Rtt::NoDepth : getU32LEB(); - int64_t htCode = getS64LEB(); // TODO: Actually s33 - HeapType ht; - if (getBasicHeapType(htCode, ht)) { - return Type(Rtt(depth, ht)); - } + auto htCode = getU32LEB(); if (size_t(htCode) >= numTypes) { throwError("invalid type index: " + std::to_string(htCode)); } @@ -6359,7 +6367,7 @@ bool WasmBinaryBuilder::maybeVisitRttCanon(Expression*& out, uint32_t code) { if (code != BinaryConsts::RttCanon) { return false; } - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); out = Builder(wasm).makeRttCanon(heapType); return true; } @@ -6368,7 +6376,7 @@ bool WasmBinaryBuilder::maybeVisitRttSub(Expression*& out, uint32_t code) { if (code != BinaryConsts::RttSub) { return false; } - auto targetHeapType = getHeapType(); + auto targetHeapType = getIndexedHeapType(); auto* parent = popNonVoidExpression(); out = Builder(wasm).makeRttSub(targetHeapType, parent); return true; @@ -6379,7 +6387,7 @@ bool WasmBinaryBuilder::maybeVisitStructNew(Expression*& out, uint32_t code) { code != BinaryConsts::StructNewDefaultWithRtt) { return false; } - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); auto* rtt = popNonVoidExpression(); validateHeapTypeUsingChild(rtt, heapType); std::vector<Expression*> operands; @@ -6411,7 +6419,7 @@ bool WasmBinaryBuilder::maybeVisitStructGet(Expression*& out, uint32_t code) { default: return false; } - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); curr->index = getU32LEB(); curr->ref = popNonVoidExpression(); validateHeapTypeUsingChild(curr->ref, heapType); @@ -6425,7 +6433,7 @@ bool WasmBinaryBuilder::maybeVisitStructSet(Expression*& out, uint32_t code) { return false; } auto* curr = allocator.alloc<StructSet>(); - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); curr->index = getU32LEB(); curr->value = popNonVoidExpression(); curr->ref = popNonVoidExpression(); @@ -6440,7 +6448,7 @@ bool WasmBinaryBuilder::maybeVisitArrayNew(Expression*& out, uint32_t code) { code != BinaryConsts::ArrayNewDefaultWithRtt) { return false; } - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); auto* rtt = popNonVoidExpression(); validateHeapTypeUsingChild(rtt, heapType); auto* size = popNonVoidExpression(); @@ -6464,7 +6472,7 @@ bool WasmBinaryBuilder::maybeVisitArrayGet(Expression*& out, uint32_t code) { default: return false; } - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); auto* index = popNonVoidExpression(); auto* ref = popNonVoidExpression(); validateHeapTypeUsingChild(ref, heapType); @@ -6476,7 +6484,7 @@ bool WasmBinaryBuilder::maybeVisitArraySet(Expression*& out, uint32_t code) { if (code != BinaryConsts::ArraySet) { return false; } - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); auto* value = popNonVoidExpression(); auto* index = popNonVoidExpression(); auto* ref = popNonVoidExpression(); @@ -6489,7 +6497,7 @@ bool WasmBinaryBuilder::maybeVisitArrayLen(Expression*& out, uint32_t code) { if (code != BinaryConsts::ArrayLen) { return false; } - auto heapType = getHeapType(); + auto heapType = getIndexedHeapType(); auto* ref = popNonVoidExpression(); validateHeapTypeUsingChild(ref, heapType); out = Builder(wasm).makeArrayLen(ref); diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 0c7448c58..2c8bc051f 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -2030,12 +2030,12 @@ void BinaryInstWriter::visitBrOn(BrOn* curr) { void BinaryInstWriter::visitRttCanon(RttCanon* curr) { o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RttCanon); - parent.writeHeapType(curr->type.getRtt().heapType); + parent.writeIndexedHeapType(curr->type.getRtt().heapType); } void BinaryInstWriter::visitRttSub(RttSub* curr) { o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RttSub); - parent.writeHeapType(curr->type.getRtt().heapType); + parent.writeIndexedHeapType(curr->type.getRtt().heapType); } void BinaryInstWriter::visitStructNew(StructNew* curr) { @@ -2045,7 +2045,7 @@ void BinaryInstWriter::visitStructNew(StructNew* curr) { } else { o << U32LEB(BinaryConsts::StructNewWithRtt); } - parent.writeHeapType(curr->rtt->type.getHeapType()); + parent.writeIndexedHeapType(curr->rtt->type.getHeapType()); } void BinaryInstWriter::visitStructGet(StructGet* curr) { @@ -2060,13 +2060,13 @@ void BinaryInstWriter::visitStructGet(StructGet* curr) { op = BinaryConsts::StructGetU; } o << int8_t(BinaryConsts::GCPrefix) << U32LEB(op); - parent.writeHeapType(heapType); + parent.writeIndexedHeapType(heapType); o << U32LEB(curr->index); } void BinaryInstWriter::visitStructSet(StructSet* curr) { o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::StructSet); - parent.writeHeapType(curr->ref->type.getHeapType()); + parent.writeIndexedHeapType(curr->ref->type.getHeapType()); o << U32LEB(curr->index); } @@ -2077,7 +2077,7 @@ void BinaryInstWriter::visitArrayNew(ArrayNew* curr) { } else { o << U32LEB(BinaryConsts::ArrayNewWithRtt); } - parent.writeHeapType(curr->rtt->type.getHeapType()); + parent.writeIndexedHeapType(curr->rtt->type.getHeapType()); } void BinaryInstWriter::visitArrayGet(ArrayGet* curr) { @@ -2092,17 +2092,17 @@ void BinaryInstWriter::visitArrayGet(ArrayGet* curr) { op = BinaryConsts::ArrayGetU; } o << int8_t(BinaryConsts::GCPrefix) << U32LEB(op); - parent.writeHeapType(heapType); + parent.writeIndexedHeapType(heapType); } void BinaryInstWriter::visitArraySet(ArraySet* curr) { o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::ArraySet); - parent.writeHeapType(curr->ref->type.getHeapType()); + parent.writeIndexedHeapType(curr->ref->type.getHeapType()); } void BinaryInstWriter::visitArrayLen(ArrayLen* curr) { o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::ArrayLen); - parent.writeHeapType(curr->ref->type.getHeapType()); + parent.writeIndexedHeapType(curr->ref->type.getHeapType()); } void BinaryInstWriter::visitRefAs(RefAs* curr) { |