1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Const generic arg fixes

This commit is contained in:
Brian Fiete 2022-04-17 17:46:35 -07:00
parent b9a9a4bfac
commit 2b9443744b
3 changed files with 34 additions and 7 deletions

View file

@ -18646,12 +18646,22 @@ void BfModule::ProcessMethod_SetupParams(BfMethodInstance* methodInstance, BfTyp
paramVar->mResolvedType = genericParamInst->mTypeConstraint; paramVar->mResolvedType = genericParamInst->mTypeConstraint;
paramVar->mConstValue = exprEvaluator.mResult.mValue; paramVar->mConstValue = exprEvaluator.mResult.mValue;
BF_ASSERT(paramVar->mConstValue.IsConst()); BF_ASSERT(paramVar->mConstValue.IsConst());
paramVar->mIsConst = true;
} }
else else
{ {
AssertErrorState(); AssertErrorState();
paramVar->mResolvedType = genericParamInst->mTypeConstraint; paramVar->mResolvedType = genericParamInst->mTypeConstraint;
paramVar->mConstValue = GetDefaultValue(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(); //AssertErrorState();
paramVar->mResolvedType = GetPrimitiveType(BfTypeCode_IntPtr); paramVar->mResolvedType = GetPrimitiveType(BfTypeCode_IntPtr);
paramVar->mConstValue = GetDefaultValue(paramVar->mResolvedType); 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()); BF_ASSERT(localIdx < methodState.mLocals.size());
paramVar = methodState.mLocals[localIdx]; paramVar = methodState.mLocals[localIdx];
if ((paramVar->mCompositeCount == -1) && if ((paramVar->mCompositeCount == -1) &&
(!paramVar->mIsConst) &&
((!paramVar->mResolvedType->IsValuelessType()) || (paramVar->mResolvedType->IsMethodRef()))) ((!paramVar->mResolvedType->IsValuelessType()) || (paramVar->mResolvedType->IsMethodRef())))
break; break;
localIdx++; localIdx++;
@ -20214,6 +20226,9 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
int curLocalIdx = localIdx++; int curLocalIdx = localIdx++;
BfLocalVariable* paramVar = methodState.mLocals[curLocalIdx]; BfLocalVariable* paramVar = methodState.mLocals[curLocalIdx];
if (paramVar->mIsConst)
continue;
if (!paramVar->IsParam()) if (!paramVar->IsParam())
continue; continue;
if (paramVar->mCompositeCount != -1) if (paramVar->mCompositeCount != -1)

View file

@ -108,14 +108,14 @@ enum BfCastFlags
BfCastFlags_WantsConst = 0x4000 BfCastFlags_WantsConst = 0x4000
}; };
enum BfCastResultFlags enum BfCastResultFlags : int8
{ {
BfCastResultFlags_None = 0, BfCastResultFlags_None = 0,
BfCastResultFlags_IsAddr = 1, BfCastResultFlags_IsAddr = 1,
BfCastResultFlags_IsTemp = 2 BfCastResultFlags_IsTemp = 2
}; };
enum BfAllocFlags enum BfAllocFlags : int8
{ {
BfAllocFlags_None = 0, BfAllocFlags_None = 0,
BfAllocFlags_RawArray = 1, BfAllocFlags_RawArray = 1,
@ -124,7 +124,7 @@ enum BfAllocFlags
BfAllocFlags_NoDefaultToMalloc = 8 BfAllocFlags_NoDefaultToMalloc = 8
}; };
enum BfProtectionCheckFlags enum BfProtectionCheckFlags : int8
{ {
BfProtectionCheckFlag_None = 0, BfProtectionCheckFlag_None = 0,
BfProtectionCheckFlag_CheckedProtected = 1, BfProtectionCheckFlag_CheckedProtected = 1,
@ -134,7 +134,7 @@ enum BfProtectionCheckFlags
BfProtectionCheckFlag_InstanceLookup = 0x10 BfProtectionCheckFlag_InstanceLookup = 0x10
}; };
enum BfEmbeddedStatementFlags enum BfEmbeddedStatementFlags : int8
{ {
BfEmbeddedStatementFlags_None = 0, BfEmbeddedStatementFlags_None = 0,
BfEmbeddedStatementFlags_IsConditional = 1, BfEmbeddedStatementFlags_IsConditional = 1,
@ -142,7 +142,7 @@ enum BfEmbeddedStatementFlags
BfEmbeddedStatementFlags_Unscoped = 4 BfEmbeddedStatementFlags_Unscoped = 4
}; };
enum BfLocalVarAssignKind enum BfLocalVarAssignKind : int8
{ {
BfLocalVarAssignKind_None = 0, BfLocalVarAssignKind_None = 0,
BfLocalVarAssignKind_Conditional = 1, BfLocalVarAssignKind_Conditional = 1,
@ -183,7 +183,8 @@ public:
bool mAllowAddr; bool mAllowAddr;
bool mIsShadow; bool mIsShadow;
bool mUsedImplicitly; // Passed implicitly to a local method, capture by ref if we can bool mUsedImplicitly; // Passed implicitly to a local method, capture by ref if we can
bool mNotCaptured; bool mNotCaptured;
bool mIsConst;
BfLocalVariable* mShadowedLocal; BfLocalVariable* mShadowedLocal;
public: public:
@ -212,8 +213,9 @@ public:
mIsLowered = false; mIsLowered = false;
mAllowAddr = false; mAllowAddr = false;
mIsShadow = false; mIsShadow = false;
mUsedImplicitly = false; mUsedImplicitly = false;
mNotCaptured = false; mNotCaptured = false;
mIsConst = false;
mShadowedLocal = NULL; mShadowedLocal = NULL;
} }

View file

@ -112,6 +112,15 @@ namespace Tests
public const int N = CalculateN(); public const int N = CalculateN();
} }
public static int Test<T>(T param1, params Span<int> param2)
where T : const String
{
int total = param1.Length;
for (int val in param2)
total += val;
return total;
}
[Test] [Test]
public static void TestBasics() public static void TestBasics()
{ {
@ -126,6 +135,7 @@ namespace Tests
Test.Assert(!iList.SequenceEquals(iSpan)); Test.Assert(!iList.SequenceEquals(iSpan));
Test.Assert(BigNum<const 3>.N == 3); Test.Assert(BigNum<const 3>.N == 3);
Test.Assert(Test("test", 1, 2, 3) == 10);
} }
} }
} }