diff options
Diffstat (limited to 'source/slang/slang-ast-val.cpp')
| -rw-r--r-- | source/slang/slang-ast-val.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/source/slang/slang-ast-val.cpp b/source/slang/slang-ast-val.cpp index b2b874fad..0dbe65ee0 100644 --- a/source/slang/slang-ast-val.cpp +++ b/source/slang/slang-ast-val.cpp @@ -7,6 +7,7 @@ #include "slang-diagnostics.h" #include "slang-syntax.h" #include "slang-ast-val.h" +#include "slang-mangle.h" namespace Slang { @@ -234,6 +235,15 @@ bool GenericParamIntVal::_isLinkTimeValOverride() return getDeclRef().getDecl()->hasModifier<ExternModifier>(); } +Val* GenericParamIntVal::_linkTimeResolveOverride(Dictionary<String, IntVal*>& map) +{ + auto name = getMangledName(getCurrentASTBuilder(), getDeclRef().declRefBase); + IntVal* v; + if (map.tryGetValue(name, v)) + return v; + return this; +} + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ErrorIntVal !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! void ErrorIntVal::_toTextOverride(StringBuilder& out) @@ -1088,6 +1098,15 @@ Val* TypeCastIntVal::tryFoldImpl(ASTBuilder* astBuilder, Type* resultType, Val* return nullptr; } +Val* TypeCastIntVal::_linkTimeResolveOverride(Dictionary<String, IntVal*>& map) +{ + auto intValBase = as<IntVal>(getBase()); + if (!intValBase) + return this; + auto resolvedBase = intValBase->linkTimeResolve(map); + return tryFoldImpl(getCurrentASTBuilder(), getType(), resolvedBase, nullptr); +} + Val* TypeCastIntVal::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) { int diff = 0; @@ -1310,6 +1329,14 @@ Val* FuncCallIntVal::tryFoldImpl(ASTBuilder* astBuilder, Type* resultType, DeclR return nullptr; } +Val* FuncCallIntVal::_linkTimeResolveOverride(Dictionary<String, IntVal*>& map) +{ + List<IntVal*> newArgs; + for (auto arg : getArgs()) + newArgs.add(as<IntVal>(arg->linkTimeResolve(map))); + return tryFoldImpl(getCurrentASTBuilder(), getType(), getFuncDeclRef(), newArgs, nullptr); +} + Val* FuncCallIntVal::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) { int diff = 0; @@ -1506,4 +1533,9 @@ bool IntVal::isLinkTimeVal() SLANG_AST_NODE_VIRTUAL_CALL(IntVal, isLinkTimeVal, ()); } +Val* IntVal::linkTimeResolve(Dictionary<String, IntVal*>& mapMangledNameToVal) +{ + SLANG_AST_NODE_VIRTUAL_CALL(IntVal, linkTimeResolve, (mapMangledNameToVal)); +} + } // namespace Slang |
