diff options
Diffstat (limited to 'src/passes/Print.cpp')
-rw-r--r-- | src/passes/Print.cpp | 62 |
1 files changed, 43 insertions, 19 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 993eddb99..05a639158 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -2665,36 +2665,57 @@ struct PrintSExpression : public UnifiedExpressionVisitor<PrintSExpression> { printTableHeader(curr); o << maybeNewLine; } - for (auto& segment : curr->segments) { - // Don't print empty segments - if (segment.data.empty()) { - continue; - } - doIndent(o, indent); - o << '('; - printMedium(o, "elem "); + ModuleUtils::iterTableSegments( + *currModule, curr->name, [&](ElementSegment* segment) { + printElementSegment(segment); + }); + } + void visitElementSegment(ElementSegment* curr) { + if (curr->table.is()) { + return; + } + printElementSegment(curr); + } + void printElementSegment(ElementSegment* curr) { + // Don't print empty segments + if (curr->data.empty()) { + return; + } + doIndent(o, indent); + o << '('; + printMedium(o, "elem"); + if (curr->hasExplicitName) { + o << ' '; + printName(curr->name, o); + } + + if (curr->table.is()) { // TODO(reference-types): check for old-style based on the complete spec if (currModule->tables.size() > 1) { // tableuse - o << '('; - printMedium(o, "table "); - printName(curr->name, o); - o << ") "; + o << " (table "; + printName(curr->table, o); + o << ")"; } - visit(segment.offset); + o << ' '; + visit(curr->offset); if (currModule->tables.size() > 1) { - o << " func"; - } - - for (auto name : segment.data) { o << ' '; - printName(name, o); + TypeNamePrinter(o, currModule).print(HeapType::func); } - o << ')' << maybeNewLine; + } else { + o << ' '; + TypeNamePrinter(o, currModule).print(HeapType::func); } + + for (auto name : curr->data) { + o << ' '; + printName(name, o); + } + o << ')' << maybeNewLine; } void printMemoryHeader(Memory* curr) { o << '('; @@ -2833,6 +2854,9 @@ struct PrintSExpression : public UnifiedExpressionVisitor<PrintSExpression> { *curr, [&](Memory* memory) { visitMemory(memory); }); ModuleUtils::iterDefinedTables(*curr, [&](Table* table) { visitTable(table); }); + for (auto& segment : curr->elementSegments) { + visitElementSegment(segment.get()); + } auto elemDeclareNames = TableUtils::getFunctionsNeedingElemDeclare(*curr); if (!elemDeclareNames.empty()) { doIndent(o, indent); |