From 2b9443744beaa61b79a5e701199e0ced6f1e5a3f Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 17 Apr 2022 17:46:35 -0700 Subject: [PATCH] Const generic arg fixes --- IDEHelper/Compiler/BfModule.cpp | 15 +++++++++++++++ IDEHelper/Compiler/BfModule.h | 16 +++++++++------- IDEHelper/Tests/src/Generics2.bf | 10 ++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 03cf5764..2a428a92 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -18646,12 +18646,22 @@ void BfModule::ProcessMethod_SetupParams(BfMethodInstance* methodInstance, BfTyp paramVar->mResolvedType = genericParamInst->mTypeConstraint; paramVar->mConstValue = exprEvaluator.mResult.mValue; BF_ASSERT(paramVar->mConstValue.IsConst()); + paramVar->mIsConst = true; } else { AssertErrorState(); paramVar->mResolvedType = genericParamInst->mTypeConstraint; paramVar->mConstValue = GetDefaultValue(genericParamInst->mTypeConstraint); + paramVar->mIsConst = true; + } + + if (paramVar->mResolvedType->IsObject()) + { + BfTypedValue typedVal(paramVar->mConstValue, paramVar->mResolvedType); + FixValueActualization(typedVal); + if (typedVal.mValue.IsConst()) + paramVar->mConstValue = typedVal.mValue; } } } @@ -18664,6 +18674,7 @@ void BfModule::ProcessMethod_SetupParams(BfMethodInstance* methodInstance, BfTyp //AssertErrorState(); paramVar->mResolvedType = GetPrimitiveType(BfTypeCode_IntPtr); paramVar->mConstValue = GetDefaultValue(paramVar->mResolvedType); + paramVar->mIsConst = true; } } @@ -20057,6 +20068,7 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup, BF_ASSERT(localIdx < methodState.mLocals.size()); paramVar = methodState.mLocals[localIdx]; if ((paramVar->mCompositeCount == -1) && + (!paramVar->mIsConst) && ((!paramVar->mResolvedType->IsValuelessType()) || (paramVar->mResolvedType->IsMethodRef()))) break; localIdx++; @@ -20214,6 +20226,9 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup, int curLocalIdx = localIdx++; BfLocalVariable* paramVar = methodState.mLocals[curLocalIdx]; + + if (paramVar->mIsConst) + continue; if (!paramVar->IsParam()) continue; if (paramVar->mCompositeCount != -1) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index dc38cb35..34f0d7fb 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -108,14 +108,14 @@ enum BfCastFlags BfCastFlags_WantsConst = 0x4000 }; -enum BfCastResultFlags +enum BfCastResultFlags : int8 { BfCastResultFlags_None = 0, BfCastResultFlags_IsAddr = 1, BfCastResultFlags_IsTemp = 2 }; -enum BfAllocFlags +enum BfAllocFlags : int8 { BfAllocFlags_None = 0, BfAllocFlags_RawArray = 1, @@ -124,7 +124,7 @@ enum BfAllocFlags BfAllocFlags_NoDefaultToMalloc = 8 }; -enum BfProtectionCheckFlags +enum BfProtectionCheckFlags : int8 { BfProtectionCheckFlag_None = 0, BfProtectionCheckFlag_CheckedProtected = 1, @@ -134,7 +134,7 @@ enum BfProtectionCheckFlags BfProtectionCheckFlag_InstanceLookup = 0x10 }; -enum BfEmbeddedStatementFlags +enum BfEmbeddedStatementFlags : int8 { BfEmbeddedStatementFlags_None = 0, BfEmbeddedStatementFlags_IsConditional = 1, @@ -142,7 +142,7 @@ enum BfEmbeddedStatementFlags BfEmbeddedStatementFlags_Unscoped = 4 }; -enum BfLocalVarAssignKind +enum BfLocalVarAssignKind : int8 { BfLocalVarAssignKind_None = 0, BfLocalVarAssignKind_Conditional = 1, @@ -183,7 +183,8 @@ public: bool mAllowAddr; bool mIsShadow; bool mUsedImplicitly; // Passed implicitly to a local method, capture by ref if we can - bool mNotCaptured; + bool mNotCaptured; + bool mIsConst; BfLocalVariable* mShadowedLocal; public: @@ -212,8 +213,9 @@ public: mIsLowered = false; mAllowAddr = false; mIsShadow = false; - mUsedImplicitly = false; + mUsedImplicitly = false; mNotCaptured = false; + mIsConst = false; mShadowedLocal = NULL; } diff --git a/IDEHelper/Tests/src/Generics2.bf b/IDEHelper/Tests/src/Generics2.bf index 642a6354..0809055a 100644 --- a/IDEHelper/Tests/src/Generics2.bf +++ b/IDEHelper/Tests/src/Generics2.bf @@ -112,6 +112,15 @@ namespace Tests public const int N = CalculateN(); } + public static int Test(T param1, params Span param2) + where T : const String + { + int total = param1.Length; + for (int val in param2) + total += val; + return total; + } + [Test] public static void TestBasics() { @@ -126,6 +135,7 @@ namespace Tests Test.Assert(!iList.SequenceEquals(iSpan)); Test.Assert(BigNum.N == 3); + Test.Assert(Test("test", 1, 2, 3) == 10); } } }