1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Fixed generic method and methodref binding issues

This commit is contained in:
Brian Fiete 2020-12-27 10:55:30 -08:00
parent 3993f657e1
commit 6c049988b3
3 changed files with 43 additions and 42 deletions

View file

@ -1875,8 +1875,9 @@ String BeModule::ToString(BeFunction* wantFunc)
str += "\n"; str += "\n";
str += "; Global variables\n"; str += "; Global variables\n";
for (auto gv : mGlobalVariables) for (int gvIdx = 0; gvIdx < (int)mGlobalVariables.size(); gvIdx++)
{ {
auto gv = mGlobalVariables[gvIdx];
str += gv->mName; str += gv->mName;
str += " ="; str += " =";
if (gv->mInitializer == NULL) if (gv->mInitializer == NULL)

View file

@ -350,7 +350,9 @@ bool BfGenericInferContext::InferGenericArgument(BfMethodInstance* methodInstanc
{ {
if ((genericParamInst->mTypeConstraint != NULL) && (genericParamInst->mTypeConstraint->IsDelegate())) if ((genericParamInst->mTypeConstraint != NULL) && (genericParamInst->mTypeConstraint->IsDelegate()))
{ {
argType = genericParamInst->mTypeConstraint; argType = mModule->ResolveGenericType(genericParamInst->mTypeConstraint, NULL, mCheckMethodGenericArguments);
if (argType == NULL)
return true;
} }
} }
@ -358,10 +360,7 @@ bool BfGenericInferContext::InferGenericArgument(BfMethodInstance* methodInstanc
auto prevArgValue = mPrevArgValues[wantGenericParam->mGenericParamIdx]; auto prevArgValue = mPrevArgValues[wantGenericParam->mGenericParamIdx];
if (prevGenericMethodArg == NULL) if (prevGenericMethodArg == NULL)
{ {
if ((argType != NULL) && (argType->IsUnspecializedTypeVariation())) _SetGeneric();
argType = mModule->ResolveGenericType(argType, NULL, mCheckMethodGenericArguments);
if (argType != NULL)
_SetGeneric();
return true; return true;
} }
@ -1072,7 +1071,7 @@ void BfMethodMatcher::CompareMethods(BfMethodInstance* prevMethodInstance, BfTyp
RETURN_RESULTS; RETURN_RESULTS;
} }
BfTypedValue BfMethodMatcher::ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute, BfType *origCheckType) BfTypedValue BfMethodMatcher::ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute, BfType *origCheckType, BfResolveArgFlags flags)
{ {
BfTypedValue argTypedValue = resolvedArg.mTypedValue; BfTypedValue argTypedValue = resolvedArg.mTypedValue;
if ((resolvedArg.mArgFlags & BfArgFlag_DelegateBindAttempt) != 0) if ((resolvedArg.mArgFlags & BfArgFlag_DelegateBindAttempt) != 0)
@ -1090,7 +1089,7 @@ BfTypedValue BfMethodMatcher::ResolveArgTypedValue(BfResolvedArg& resolvedArg, B
{ {
return BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), boundMethodInstance->GetOwner()); return BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), boundMethodInstance->GetOwner());
} }
else if (boundMethodInstance->mDisallowCalling) else if ((boundMethodInstance->mDisallowCalling) || ((flags & BfResolveArgFlag_FromGeneric) == 0))
{ {
argTypedValue = BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), checkType); argTypedValue = BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), checkType);
} }
@ -1592,7 +1591,7 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst
argTypedValue = mTarget; argTypedValue = mTarget;
} }
else else
argTypedValue = ResolveArgTypedValue(mArguments[argIdx], checkType, genericArgumentsSubstitute, origCheckType); argTypedValue = ResolveArgTypedValue(mArguments[argIdx], checkType, genericArgumentsSubstitute, origCheckType, BfResolveArgFlag_FromGeneric);
if (!argTypedValue.IsUntypedValue()) if (!argTypedValue.IsUntypedValue())
{ {
auto type = argTypedValue.mType; auto type = argTypedValue.mType;
@ -3295,7 +3294,7 @@ void BfExprEvaluator::Visit(BfStringInterpolationExpression* stringInterpolation
argExprs.Add(stringInterpolationExpression); argExprs.Add(stringInterpolationExpression);
BfSizedArray<BfExpression*> sizedArgExprs(argExprs); BfSizedArray<BfExpression*> sizedArgExprs(argExprs);
BfResolvedArgs argValues(&sizedArgExprs); BfResolvedArgs argValues(&sizedArgExprs);
ResolveArgValues(argValues, BfResolveArgFlag_InsideStringInterpolationAlloc); ResolveArgValues(argValues, BfResolveArgsFlag_InsideStringInterpolationAlloc);
MatchMethod(stringInterpolationExpression, NULL, newString, false, false, "AppendF", argValues, NULL); MatchMethod(stringInterpolationExpression, NULL, newString, false, false, "AppendF", argValues, NULL);
mResult = newString; mResult = newString;
@ -4568,7 +4567,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
return BfTypedValue(); return BfTypedValue();
} }
void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgFlags flags) void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgsFlags flags)
{ {
static int idx = 0; static int idx = 0;
idx++; idx++;
@ -4589,7 +4588,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
if (autoComplete != NULL) if (autoComplete != NULL)
{ {
hadIgnoredFixits = autoComplete->mIgnoreFixits; hadIgnoredFixits = autoComplete->mIgnoreFixits;
if (flags & BfResolveArgFlag_DeferFixits) if (flags & BfResolveArgsFlag_DeferFixits)
autoComplete->mIgnoreFixits = true; autoComplete->mIgnoreFixits = true;
} }
@ -4649,14 +4648,14 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_StringInterpolateArg); resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_StringInterpolateArg);
BfExprEvaluator exprEvaluator(mModule); BfExprEvaluator exprEvaluator(mModule);
exprEvaluator.mResolveGenericParam = (flags & BfResolveArgFlag_AllowUnresolvedTypes) == 0; exprEvaluator.mResolveGenericParam = (flags & BfResolveArgsFlag_AllowUnresolvedTypes) == 0;
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_AllowOutExpr); exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_AllowOutExpr);
bool handled = false; bool handled = false;
bool evaluated = false; bool evaluated = false;
if (auto interpolateExpr = BfNodeDynCastExact<BfStringInterpolationExpression>(argExpr)) if (auto interpolateExpr = BfNodeDynCastExact<BfStringInterpolationExpression>(argExpr))
{ {
if ((interpolateExpr->mAllocNode == NULL) || ((flags & BfResolveArgFlag_InsideStringInterpolationAlloc) != 0)) if ((interpolateExpr->mAllocNode == NULL) || ((flags & BfResolveArgsFlag_InsideStringInterpolationAlloc) != 0))
{ {
resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_StringInterpolateFormat); resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_StringInterpolateFormat);
for (auto innerExpr : interpolateExpr->mExpressions) for (auto innerExpr : interpolateExpr->mExpressions)
@ -4665,7 +4664,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
} }
bool deferParamEval = false; bool deferParamEval = false;
if ((flags & BfResolveArgFlag_DeferParamEval) != 0) if ((flags & BfResolveArgsFlag_DeferParamEval) != 0)
{ {
if (argExpr != NULL) if (argExpr != NULL)
{ {
@ -4749,7 +4748,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
if ((argExpr != NULL) && (!handled)) if ((argExpr != NULL) && (!handled))
{ {
bool deferParamValues = (flags & BfResolveArgFlag_DeferParamValues) != 0; bool deferParamValues = (flags & BfResolveArgsFlag_DeferParamValues) != 0;
SetAndRestoreValue<bool> ignoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, mModule->mBfIRBuilder->mIgnoreWrites || deferParamValues); SetAndRestoreValue<bool> ignoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, mModule->mBfIRBuilder->mIgnoreWrites || deferParamValues);
auto prevInsertBlock = mModule->mBfIRBuilder->GetInsertBlock(); auto prevInsertBlock = mModule->mBfIRBuilder->GetInsertBlock();
if (deferParamValues) if (deferParamValues)
@ -13214,7 +13213,7 @@ void BfExprEvaluator::CreateObject(BfObjectCreateExpression* objCreateExpr, BfAs
if (objCreateExpr != NULL) if (objCreateExpr != NULL)
{ {
argValues.Init(objCreateExpr->mOpenToken, &objCreateExpr->mArguments, &objCreateExpr->mCommas, objCreateExpr->mCloseToken); argValues.Init(objCreateExpr->mOpenToken, &objCreateExpr->mArguments, &objCreateExpr->mCommas, objCreateExpr->mCloseToken);
ResolveArgValues(argValues, BfResolveArgFlag_DeferParamEval); //// ResolveArgValues(argValues, BfResolveArgsFlag_DeferParamEval); ////
} }
if (typeInstance == NULL) if (typeInstance == NULL)
@ -13914,11 +13913,6 @@ BfModuleMethodInstance BfExprEvaluator::GetSelectedMethod(BfAstNode* targetSrc,
if (methodDef->IsEmptyPartial()) if (methodDef->IsEmptyPartial())
return methodInstance; return methodInstance;
if (methodDef->mName == "RemoveFast")
{
NOP;
}
if (methodInstance.mMethodInstance->mMethodInfoEx != NULL) if (methodInstance.mMethodInstance->mMethodInfoEx != NULL)
{ {
for (int checkGenericIdx = 0; checkGenericIdx < (int)methodInstance.mMethodInstance->mMethodInfoEx->mGenericParams.size(); checkGenericIdx++) for (int checkGenericIdx = 0; checkGenericIdx < (int)methodInstance.mMethodInstance->mMethodInfoEx->mGenericParams.size(); checkGenericIdx++)
@ -15045,7 +15039,7 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
{ {
BfResolvedArgs argValues(invocationExpr->mOpenParen, &invocationExpr->mArguments, &invocationExpr->mCommas, invocationExpr->mCloseParen); BfResolvedArgs argValues(invocationExpr->mOpenParen, &invocationExpr->mArguments, &invocationExpr->mCommas, invocationExpr->mCloseParen);
BfResolveArgFlags resolveArgsFlags = BfResolveArgFlag_DeferParamEval; BfResolveArgsFlags resolveArgsFlags = BfResolveArgsFlag_DeferParamEval;
ResolveArgValues(argValues, resolveArgsFlags); ResolveArgValues(argValues, resolveArgsFlags);
if ((mReceivingValue != NULL) && (mReceivingValue->mType == expectingType) && (mReceivingValue->IsAddr())) if ((mReceivingValue != NULL) && (mReceivingValue->mType == expectingType) && (mReceivingValue->IsAddr()))
@ -15073,7 +15067,7 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
{ {
BfResolvedArgs argValues(invocationExpr->mOpenParen, &invocationExpr->mArguments, &invocationExpr->mCommas, invocationExpr->mCloseParen); BfResolvedArgs argValues(invocationExpr->mOpenParen, &invocationExpr->mArguments, &invocationExpr->mCommas, invocationExpr->mCloseParen);
BfResolveArgFlags resolveArgsFlags = BfResolveArgFlag_None; BfResolveArgsFlags resolveArgsFlags = BfResolveArgsFlag_None;
ResolveArgValues(argValues, resolveArgsFlags); ResolveArgValues(argValues, resolveArgsFlags);
CheckGenericCtor((BfGenericParamType*)expectingType, argValues, invocationExpr->mTarget); CheckGenericCtor((BfGenericParamType*)expectingType, argValues, invocationExpr->mTarget);
@ -15532,10 +15526,10 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
} }
} }
BfResolveArgFlags resolveArgsFlags = (BfResolveArgFlags)(BfResolveArgFlag_DeferFixits | BfResolveArgFlag_AllowUnresolvedTypes); BfResolveArgsFlags resolveArgsFlags = (BfResolveArgsFlags)(BfResolveArgsFlag_DeferFixits | BfResolveArgsFlag_AllowUnresolvedTypes);
resolveArgsFlags = (BfResolveArgFlags)(resolveArgsFlags | BfResolveArgFlag_DeferParamEval); resolveArgsFlags = (BfResolveArgsFlags)(resolveArgsFlags | BfResolveArgsFlag_DeferParamEval);
if ((mayBeSkipCall) || (mayBeConstEvalCall)) if ((mayBeSkipCall) || (mayBeConstEvalCall))
resolveArgsFlags = (BfResolveArgFlags)(resolveArgsFlags | BfResolveArgFlag_DeferParamValues); resolveArgsFlags = (BfResolveArgsFlags)(resolveArgsFlags | BfResolveArgsFlag_DeferParamValues);
static int sCallIdx = 0; static int sCallIdx = 0;
sCallIdx++; sCallIdx++;
@ -18260,7 +18254,7 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr)
SizedArray<BfExpression*, 2> argExprs; SizedArray<BfExpression*, 2> argExprs;
BfSizedArray<BfExpression*> sizedArgExprs(indexerExpr->mArguments); BfSizedArray<BfExpression*> sizedArgExprs(indexerExpr->mArguments);
BfResolvedArgs argValues(&sizedArgExprs); BfResolvedArgs argValues(&sizedArgExprs);
ResolveArgValues(argValues, BfResolveArgFlag_DeferParamEval); ResolveArgValues(argValues, BfResolveArgsFlag_DeferParamEval);
//exprEvaluator.MatchMethod(elementExpr, NULL, initValue, false, false, "Add", argValues, NULL); //exprEvaluator.MatchMethod(elementExpr, NULL, initValue, false, false, "Add", argValues, NULL);
mIndexerValues = argValues.mResolvedArgs; mIndexerValues = argValues.mResolvedArgs;

View file

@ -23,14 +23,20 @@ enum BfArgFlags
BfArgFlag_StringInterpolateArg = 0x1000 BfArgFlag_StringInterpolateArg = 0x1000
}; };
enum BfResolveArgsFlags
{
BfResolveArgsFlag_None = 0,
BfResolveArgsFlag_DeferFixits = 1,
BfResolveArgsFlag_DeferParamValues = 2, // We still evaluate but don't generate code until the method is selected (for SkipCall support)
BfResolveArgsFlag_DeferParamEval = 4,
BfResolveArgsFlag_AllowUnresolvedTypes = 8,
BfResolveArgsFlag_InsideStringInterpolationAlloc = 0x10
};
enum BfResolveArgFlags enum BfResolveArgFlags
{ {
BfResolveArgFlag_None = 0, BfResolveArgFlag_None = 0,
BfResolveArgFlag_DeferFixits = 1, BfResolveArgFlag_FromGeneric = 1
BfResolveArgFlag_DeferParamValues = 2, // We still evaluate but don't generate code until the method is selected (for SkipCall support)
BfResolveArgFlag_DeferParamEval = 4,
BfResolveArgFlag_AllowUnresolvedTypes = 8,
BfResolveArgFlag_InsideStringInterpolationAlloc = 0x10
}; };
class BfResolvedArg class BfResolvedArg
@ -202,7 +208,7 @@ public:
Array<BfAmbiguousEntry> mAmbiguousEntries; Array<BfAmbiguousEntry> mAmbiguousEntries;
public: public:
BfTypedValue ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute, BfType *origCheckType = NULL); BfTypedValue ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute, BfType *origCheckType = NULL, BfResolveArgFlags flags = BfResolveArgFlag_None);
bool InferFromGenericConstraints(BfGenericParamInstance* genericParamInst, BfTypeVector* methodGenericArgs); bool InferFromGenericConstraints(BfGenericParamInstance* genericParamInst, BfTypeVector* methodGenericArgs);
void CompareMethods(BfMethodInstance* prevMethodInstance, BfTypeVector* prevGenericArgumentsSubstitute, void CompareMethods(BfMethodInstance* prevMethodInstance, BfTypeVector* prevGenericArgumentsSubstitute,
BfMethodInstance* newMethodInstance, BfTypeVector* genericArgumentsSubstitute, BfMethodInstance* newMethodInstance, BfTypeVector* genericArgumentsSubstitute,
@ -391,7 +397,7 @@ public:
BfType* BindGenericType(BfAstNode* node, BfType* bindType); BfType* BindGenericType(BfAstNode* node, BfType* bindType);
BfType* ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0); BfType* ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
void ResolveGenericType(); void ResolveGenericType();
void ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgFlags flags = BfResolveArgFlag_None); void ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgsFlags flags = BfResolveArgsFlag_None);
BfAllocTarget ResolveAllocTarget(BfAstNode* newNode, BfTokenNode*& newToken, BfCustomAttributes** outCustomAttributes = NULL); BfAllocTarget ResolveAllocTarget(BfAstNode* newNode, BfTokenNode*& newToken, BfCustomAttributes** outCustomAttributes = NULL);
BfTypedValue ResolveArgValue(BfResolvedArg& resolvedArg, BfType* wantType, BfTypedValue* receivingValue = NULL, BfParamKind paramKind = BfParamKind_Normal, BfIdentifierNode* paramNameNode = NULL); BfTypedValue ResolveArgValue(BfResolvedArg& resolvedArg, BfType* wantType, BfTypedValue* receivingValue = NULL, BfParamKind paramKind = BfParamKind_Normal, BfIdentifierNode* paramNameNode = NULL);
BfMethodDef* GetPropertyMethodDef(BfPropertyDef* propDef, BfMethodType methodType, BfCheckedKind checkedKind, BfTypedValue propTarget); BfMethodDef* GetPropertyMethodDef(BfPropertyDef* propDef, BfMethodType methodType, BfCheckedKind checkedKind, BfTypedValue propTarget);