From 060071604bc715951ddf940a51ced1da48b3dd10 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 29 Oct 2020 10:21:07 -0700 Subject: Generate `switch` based dynamic dispatch logic. (#1591) Co-authored-by: Tim Foley --- source/slang/slang-emit-cpp.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'source/slang/slang-emit-cpp.cpp') diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index 6a82815a9..d1250357a 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -1651,35 +1651,27 @@ void CPPSourceEmitter::_emitWitnessTableDefinitions() m_writer->emit(getName(witnessTable)); m_writer->emit(" = {\n"); m_writer->indent(); - bool isFirstEntry = true; + auto seqIdDecoration = witnessTable->findDecoration(); + SLANG_ASSERT(seqIdDecoration); + m_writer->emit((UInt)seqIdDecoration->getSequentialID()); for (Index i = 0; i < sortedWitnessTableEntries.getCount(); i++) { auto entry = sortedWitnessTableEntries[i]; if (auto funcVal = as(entry->satisfyingVal.get())) { - if (!isFirstEntry) - m_writer->emit(",\n"); - else - isFirstEntry = false; - + m_writer->emit(",\n"); m_writer->emit(getName(funcVal)); } else if (auto witnessTableVal = as(entry->getSatisfyingVal())) { - if (!isFirstEntry) - m_writer->emit(",\n"); - else - isFirstEntry = false; + m_writer->emit(",\n"); m_writer->emit("&"); m_writer->emit(getName(witnessTableVal)); } else if (entry->getSatisfyingVal() && isPointerOfType(entry->getSatisfyingVal()->getDataType(), kIROp_RTTIType)) { - if (!isFirstEntry) - m_writer->emit(",\n"); - else - isFirstEntry = false; + m_writer->emit(",\n"); emitInstExpr(entry->getSatisfyingVal(), getInfo(EmitOp::General)); } else @@ -1704,6 +1696,7 @@ void CPPSourceEmitter::emitInterface(IRInterfaceType* interfaceType) emitSimpleType(interfaceType); m_writer->emit("\n{\n"); m_writer->indent(); + m_writer->emit("uint32_t sequentialID;\n"); for (UInt i = 0; i < interfaceType->getOperandCount(); i++) { auto entry = as(interfaceType->getOperand(i)); @@ -2196,6 +2189,12 @@ bool CPPSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOut m_writer->emit(getName(inst->getOperand(1))); return true; } + case kIROp_GetSequentialID: + { + emitInstExpr(inst->getOperand(0), inOuterPrec); + m_writer->emit("->sequentialID"); + return true; + } case kIROp_WitnessTable: { m_writer->emit("(&"); -- cgit v1.2.3