diff options
| author | Yong He <yonghe@outlook.com> | 2018-01-21 16:26:52 -0800 |
|---|---|---|
| committer | Tim Foley <tfoleyNV@users.noreply.github.com> | 2018-01-21 16:26:52 -0800 |
| commit | 8196dc4a684a75344e507697273e2123af97b979 (patch) | |
| tree | dbee3f92a10f15a9f7202010e1683b369c38ba15 /source/slang/ir.cpp | |
| parent | 4044a1d3a0605198465a7eb6e0e3c1f8b1a3c298 (diff) | |
specialize witness tables when needed when specializing `lookup_witness_table` instruction. (#376)
Diffstat (limited to 'source/slang/ir.cpp')
| -rw-r--r-- | source/slang/ir.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/source/slang/ir.cpp b/source/slang/ir.cpp index 7318bff4c..1d3c91979 100644 --- a/source/slang/ir.cpp +++ b/source/slang/ir.cpp @@ -4862,6 +4862,20 @@ namespace Slang auto interfaceDeclRef = ((IRDeclRef*)lookupInst->interfaceType.usedValue)->declRef; auto mangledName = getMangledNameForConformanceWitness(srcDeclRef, interfaceDeclRef); witnessTables.TryGetValue(mangledName, witnessTable); + + if (!witnessTable) + { + // try specialize the witness table + auto genDeclRef = srcDeclRef; + genDeclRef.substitutions = createDefaultSubstitutions(module->session, genDeclRef.decl); + auto genName = getMangledNameForConformanceWitness(genDeclRef, interfaceDeclRef); + IRWitnessTable* genTable = nullptr; + if (witnessTables.TryGetValue(genName, genTable)) + { + witnessTable = specializeWitnessTable(sharedContext, genTable, srcDeclRef, nullptr); + witnessTables.AddIfNotExists(witnessTable->mangledName, witnessTable); + } + } if (witnessTable) { lookupInst->replaceUsesWith(witnessTable); |
