diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-s-parser.h | 10 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 27 |
2 files changed, 21 insertions, 16 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 9fb9d4389..6ccc7c36c 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -137,6 +137,14 @@ class SExpressionWasmBuilder { std::map<Name, Signature> functionSignatures; std::unordered_map<cashew::IString, Index> debugInfoFileIndices; + // Maps type indexes to a mapping of field index => name. This is not the same + // as the field names stored on the wasm object, as that maps types after + // their canonicalization. Canonicalization loses information, which means + // that structurally identical types cannot have different names. However, + // while parsing the text format we keep this mapping of type indexes to names + // which does allow reading such content. + std::unordered_map<size_t, std::unordered_map<Index, Name>> fieldNames; + public: // Assumes control of and modifies the input. SExpressionWasmBuilder(Module& wasm, Element& module, IRProfile profile); @@ -272,7 +280,7 @@ private: Expression* makeRttCanon(Element& s); Expression* makeRttSub(Element& s); Expression* makeStructNew(Element& s, bool default_); - Index getStructIndex(const HeapType& type, Element& s); + Index getStructIndex(Element& type, Element& field); Expression* makeStructGet(Element& s, bool signed_ = false); Expression* makeStructSet(Element& s); Expression* makeArrayNew(Element& s, bool default_); diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 0b0f3f407..3baf19063 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -786,10 +786,6 @@ void SExpressionWasmBuilder::preParseHeapTypes(Element& module) { builder.getTempTupleType(results)); }; - // Maps type indexes to a mapping of field index => name. We store the data - // here while parsing as types have not been created yet. - std::unordered_map<size_t, std::unordered_map<Index, Name>> fieldNames; - // Parses a field, and notes the name if one is found. auto parseField = [&](Element* elem, Name& name) { Mutability mutable_ = Immutable; @@ -2610,27 +2606,28 @@ Expression* SExpressionWasmBuilder::makeStructNew(Element& s, bool default_) { return Builder(wasm).makeStructNew(rtt, operands); } -Index SExpressionWasmBuilder::getStructIndex(const HeapType& type, Element& s) { - if (s.dollared()) { - auto name = s.str(); - auto struct_ = type.getStruct(); +Index SExpressionWasmBuilder::getStructIndex(Element& type, Element& field) { + if (field.dollared()) { + auto name = field.str(); + auto index = typeIndices[type.str().str]; + auto struct_ = types[index].getStruct(); auto& fields = struct_.fields; - const auto& fieldNames = wasm.typeNames[type].fieldNames; + const auto& names = fieldNames[index]; for (Index i = 0; i < fields.size(); i++) { - auto it = fieldNames.find(i); - if (it != fieldNames.end() && it->second == name) { + auto it = names.find(i); + if (it != names.end() && it->second == name) { return i; } } - throw ParseException("bad struct field name", s.line, s.col); + throw ParseException("bad struct field name", field.line, field.col); } // this is a numeric index - return atoi(s.c_str()); + return atoi(field.c_str()); } Expression* SExpressionWasmBuilder::makeStructGet(Element& s, bool signed_) { auto heapType = parseHeapType(*s[1]); - auto index = getStructIndex(heapType, *s[2]); + auto index = getStructIndex(*s[1], *s[2]); auto type = heapType.getStruct().fields[index].type; auto ref = parseExpression(*s[3]); validateHeapTypeUsingChild(ref, heapType, s); @@ -2639,7 +2636,7 @@ Expression* SExpressionWasmBuilder::makeStructGet(Element& s, bool signed_) { Expression* SExpressionWasmBuilder::makeStructSet(Element& s) { auto heapType = parseHeapType(*s[1]); - auto index = getStructIndex(heapType, *s[2]); + auto index = getStructIndex(*s[1], *s[2]); auto ref = parseExpression(*s[3]); validateHeapTypeUsingChild(ref, heapType, s); auto value = parseExpression(*s[4]); |