summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2018-01-21 16:26:52 -0800
committerTim Foley <tfoleyNV@users.noreply.github.com>2018-01-21 16:26:52 -0800
commit8196dc4a684a75344e507697273e2123af97b979 (patch)
treedbee3f92a10f15a9f7202010e1683b369c38ba15 /source
parent4044a1d3a0605198465a7eb6e0e3c1f8b1a3c298 (diff)
specialize witness tables when needed when specializing `lookup_witness_table` instruction. (#376)
Diffstat (limited to 'source')
-rw-r--r--source/slang/ir.cpp14
-rw-r--r--source/slang/syntax.cpp7
-rw-r--r--source/slang/type-defs.h1
3 files changed, 21 insertions, 1 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);
diff --git a/source/slang/syntax.cpp b/source/slang/syntax.cpp
index ab4a5f94c..3bccf51ce 100644
--- a/source/slang/syntax.cpp
+++ b/source/slang/syntax.cpp
@@ -856,7 +856,12 @@ void Type::accept(IValVisitor* visitor, void* extra)
Type* ErrorType::CreateCanonicalType()
{
- return this;
+ return this;
+ }
+
+ RefPtr<Val> ErrorType::SubstituteImpl(SubstitutionSet /*subst*/, int* /*ioDiff*/)
+ {
+ return this;
}
int ErrorType::GetHashCode()
diff --git a/source/slang/type-defs.h b/source/slang/type-defs.h
index c4ec09f1d..db9630c0e 100644
--- a/source/slang/type-defs.h
+++ b/source/slang/type-defs.h
@@ -36,6 +36,7 @@ public:
protected:
virtual bool EqualsImpl(Type * type) override;
+ virtual RefPtr<Val> SubstituteImpl(SubstitutionSet subst, int* ioDiff) override;
virtual Type* CreateCanonicalType() override;
virtual int GetHashCode() override;
)