From a9214f34358b2fc0bf61ef90e3719a13b180b423 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 8 Apr 2020 10:56:00 -0400 Subject: Remove static struct members from layout and reflection (#1310) * * Added MemberFilterStyle - controls action of FilteredMemberList and FilteredMemberRefList * Splt out template implementations * Use more standard method names dofr FilteredMemberRefList * Added reflect-static.slang test * Added isNotEmpty/isEmpty to filtered lists * Added ability to index into filtered list (so not require building of array) * Default MemberFilterStyle to All. * Remove explicit MemberFilterStyle::All --- source/slang/slang-lower-to-ir.cpp | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) (limited to 'source/slang/slang-lower-to-ir.cpp') diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index a52f67b8a..009e776bb 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -582,7 +582,7 @@ LoweredValInfo emitCallToDeclRef( DeclRef getterDeclRef; bool justAGetter = true; - for (auto accessorDeclRef : getMembersOfType(subscriptDeclRef)) + for (auto accessorDeclRef : getMembersOfType(subscriptDeclRef, MemberFilterStyle::Instance)) { // We want to track whether this subscript has any accessors other than // `get` (assuming that everything except `get` can be used for setting...). @@ -786,8 +786,8 @@ top: // in case the `get` operation has a natural translation for // a target, while the general `ref` case does not...) - auto getters = getMembersOfType(boundSubscriptInfo->declRef); - if (getters.Count()) + auto getters = getMembersOfType(boundSubscriptInfo->declRef, MemberFilterStyle::Instance); + if (getters.getCount()) { lowered = emitCallToDeclRef( context, @@ -798,8 +798,8 @@ top: goto top; } - auto refAccessors = getMembersOfType(boundSubscriptInfo->declRef); - if(refAccessors.Count()) + auto refAccessors = getMembersOfType(boundSubscriptInfo->declRef, MemberFilterStyle::Instance); + if(refAccessors.getCount()) { // The `ref` accessor will return a pointer to the value, so // we need to reflect that in the type of our `call` instruction. @@ -2198,11 +2198,8 @@ struct ExprLoweringVisitorBase : ExprVisitor if (auto aggTypeDeclRef = declRef.as()) { List args; - for (auto ff : getMembersOfType(aggTypeDeclRef)) + for (auto ff : getMembersOfType(aggTypeDeclRef, MemberFilterStyle::Instance)) { - if (ff.getDecl()->HasModifier()) - continue; - auto irFieldVal = getSimpleVal(context, getDefaultVal(ff)); args.add(irFieldVal); } @@ -2322,11 +2319,8 @@ struct ExprLoweringVisitorBase : ExprVisitor if (auto aggTypeDeclRef = declRef.as()) { UInt argCounter = 0; - for (auto ff : getMembersOfType(aggTypeDeclRef)) + for (auto ff : getMembersOfType(aggTypeDeclRef, MemberFilterStyle::Instance)) { - if (ff.getDecl()->HasModifier()) - continue; - UInt argIndex = argCounter++; if (argIndex < argCount) { @@ -3908,15 +3902,15 @@ LoweredValInfo tryGetAddress( // where we really want/need a pointer to be able to make progress. // if(mode != TryGetAddressMode::Aggressive - && getMembersOfType(subscriptInfo->declRef).Count()) + && getMembersOfType(subscriptInfo->declRef, MemberFilterStyle::Instance).isNonEmpty()) { // There is a setter that we should consider using, // so don't go and aggressively collapse things just yet. return val; } - auto refAccessors = getMembersOfType(subscriptInfo->declRef); - if(refAccessors.Count()) + auto refAccessors = getMembersOfType(subscriptInfo->declRef, MemberFilterStyle::Instance); + if(refAccessors.isNonEmpty()) { // The `ref` accessor will return a pointer to the value, so // we need to reflect that in the type of our `call` instruction. @@ -4140,8 +4134,8 @@ top: auto subscriptInfo = left.getBoundSubscriptInfo(); // Search for an appropriate "setter" declaration - auto setters = getMembersOfType(subscriptInfo->declRef); - if (setters.Count()) + auto setters = getMembersOfType(subscriptInfo->declRef, MemberFilterStyle::Instance); + if (setters.isNonEmpty()) { auto allArgs = subscriptInfo->args; addArgs(context, &allArgs, right); @@ -4155,8 +4149,8 @@ top: return; } - auto refAccessors = getMembersOfType(subscriptInfo->declRef); - if(refAccessors.Count()) + auto refAccessors = getMembersOfType(subscriptInfo->declRef, MemberFilterStyle::Instance); + if(refAccessors.isNonEmpty()) { // The `ref` accessor will return a pointer to the value, so // we need to reflect that in the type of our `call` instruction. -- cgit v1.2.3