diff options
| author | Yong He <yonghe@outlook.com> | 2017-11-24 11:55:54 -0500 |
|---|---|---|
| committer | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-11-24 08:55:54 -0800 |
| commit | 109ee8aae399042fba6ea71e43e5ee2d441288dd (patch) | |
| tree | 3ece48c6b575f14500666d9f808022eda846a517 /source/slang/syntax.h | |
| parent | 83d49ce376185f7dc3f40eb531f01ee350220959 (diff) | |
Fix substitution mechanism to remove special cases for global params (#297)
Add a new function:
`substituteSubstitutions(Substitutions * substHead, Substitutions subst, int * ioDiff)`
This function substitutes the type arguments referenced in a linked list of substitutions headed at `substHead` using the substitutions specified by `subst`. If the linked list `substHead` does not contain `GlobalGenericParamSubstitution` entries, they will be added to the bottom (outter most) of the linked list.
Note that this function should be called when `substHead` is known to be the head of substitution linked list because the existance of `GlobalGenericPaaramSubstitution` is detected assuming the linked lists starts at `substHead`. If a substitution that is not the head of a substitution linked list is passed in, duplicate `GlobalGenericParamSubstitution`s could be appended to the linked list.
This means that this function should *not* be called in places like `GenericSubstitution::SubstitutionImpl()` for its outer substitutions, because `outer` is obviously not the head of the linked list. Instead, use this function to substitution the substitution lists of `DeclRef` etc. instead of calling `declRef.substitutions->SubstituteImpl()` where the head to the linked list is known as a member of that class.
With this function, IRSpecContext::maybeCloneType() is simplified down to `originalType->Substitute(subst)`
Updates `DeclRefBase::SubstituteImpl` and `DeclRefType::SubstituteImpl` to call `substituteSubstitutions` instead of making direct `substitutions->SubstituteImpl` call.
Providing actual implementation of `GlobalGenericParamSubstitution::SubstituteImpl` instead of just returning `this` to deal with potential situations where a true substitution is needed.
Diffstat (limited to 'source/slang/syntax.h')
| -rw-r--r-- | source/slang/syntax.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/source/slang/syntax.h b/source/slang/syntax.h index f3690d9ae..e6a010a4a 100644 --- a/source/slang/syntax.h +++ b/source/slang/syntax.h @@ -1162,6 +1162,23 @@ namespace Slang void removeSubstitution(DeclRefBase & declRef, RefPtr<Substitutions> subst); bool hasGenericSubstitutions(RefPtr<Substitutions> subst); RefPtr<GenericSubstitution> getGenericSubstitution(RefPtr<Substitutions> subst); + + // This function substitutes the type arguments referenced in a linked list of substitutions + // which head is at `substHead` using the substitutions specified by `subst`. If the linked + // list `substHead` does not contain `GlobalGenericParamSubstitution` entries, they will be + // added to the bottom(outter most) of the linked list. + // Note that this function should be called when `substHead` is known to be the head of + // substitution linked list because the existance of `GlobalGenericPaaramSubstitution` is + // detected assuming the linked lists starts at `substHead`. If a substitution that is not + // the head of a substitution linked list is passed in, duplicate + // `GlobalGenericParamSubstitution`s could be appended to the linked list. + // This means that this function should * not* be called in places like + // `GenericSubstitution::SubstitutionImpl()` for its outer substitutions, because `outer` is + // obviously not the head of the linked list. Instead, use this function to substitution the + // substitution lists of `DeclRef` etc. to replace the call of + // `declRef.substitutions->SubstituteImpl()`, because the head to the linked list is known as a + // member of that class there. + RefPtr<Substitutions> substituteSubstitutions(RefPtr<Substitutions> oldSubst, Substitutions * subst, int * ioDiff); } // namespace Slang #endif
\ No newline at end of file |
