diff options
| author | Yong He <yonghe@outlook.com> | 2020-10-29 10:21:07 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-29 10:21:07 -0700 |
| commit | 060071604bc715951ddf940a51ced1da48b3dd10 (patch) | |
| tree | 19daa4c23bdc5098e8bf5c1e28d5dbe1a389eca3 /source/slang/slang-emit-cpp.cpp | |
| parent | 494e09af2cebafa34db49dc1f60afd43aebed619 (diff) | |
Generate `switch` based dynamic dispatch logic. (#1591)
Co-authored-by: Tim Foley <tim.foley.is@gmail.com>
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
| -rw-r--r-- | source/slang/slang-emit-cpp.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
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<IRSequentialIDDecoration>(); + 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<IRFunc>(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<IRWitnessTable>(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<IRInterfaceRequirementEntry>(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("(&"); |
