diff options
| author | Yong He <yonghe@outlook.com> | 2020-06-19 11:19:51 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-19 11:19:51 -0700 |
| commit | 110d15b61ac5d76da001d412eaa4be07f3cd8f4d (patch) | |
| tree | 6d2cef5dab495b484844b4d54c312751af62091e /source/slang/slang-emit-cpp.cpp | |
| parent | 5fbb9ff7e1516bd787695d2c9d80b696f0a9ca9a (diff) | |
Dynamic dispatch for static member functions of associatedtypes. (#1404)
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
| -rw-r--r-- | source/slang/slang-emit-cpp.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index accb290fa..4a59f4cf9 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -1711,6 +1711,15 @@ void CPPSourceEmitter::_emitWitnessTableDefinitions() m_writer->emit("&KernelContext::"); m_writer->emit(_getWitnessTableWrapperFuncName(funcVal)); } + else if (auto witnessTableVal = as<IRWitnessTable>(entry->getSatisfyingVal())) + { + if (!isFirstEntry) + m_writer->emit(",\n"); + else + isFirstEntry = false; + m_writer->emit("&"); + m_writer->emit(getName(witnessTableVal)); + } else { // TODO: handle other witness table entry types. @@ -1745,16 +1754,11 @@ void CPPSourceEmitter::_maybeEmitWitnessTableTypeDefinition( emitSimpleType(interfaceType); m_writer->emit("\n{\n"); m_writer->indent(); - bool isFirstEntry = true; 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; emitType(funcVal->getResultType()); m_writer->emit(" (KernelContext::*"); m_writer->emit(getName(entry->requirementKey.get())); @@ -1777,6 +1781,13 @@ void CPPSourceEmitter::_maybeEmitWitnessTableTypeDefinition( } m_writer->emit(");\n"); } + else if (auto witnessTableVal = as<IRWitnessTable>(entry->getSatisfyingVal())) + { + emitType(as<IRType>(witnessTableVal->getOperand(0))); + m_writer->emit("* "); + m_writer->emit(getName(entry->requirementKey.get())); + m_writer->emit(";\n"); + } else { // TODO: handle other witness table entry types. |
