summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit-cpp.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2020-10-29 10:21:07 -0700
committerGitHub <noreply@github.com>2020-10-29 10:21:07 -0700
commit060071604bc715951ddf940a51ced1da48b3dd10 (patch)
tree19daa4c23bdc5098e8bf5c1e28d5dbe1a389eca3 /source/slang/slang-emit-cpp.cpp
parent494e09af2cebafa34db49dc1f60afd43aebed619 (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.cpp27
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("(&");