1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Fixed erroneous autoprop optimization when getter or setter has a body

This commit is contained in:
Brian Fiete 2021-06-29 16:02:42 -07:00
parent 78c39c5f87
commit 91897f8cb3

View file

@ -4871,34 +4871,45 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
{
if ((curCheckType->mTypeDef->HasAutoProperty(propertyDeclaration)) && (propertyDeclaration->mVirtualSpecifier == NULL))
{
bool hasSetter = GetPropertyMethodDef(mPropDef, BfMethodType_PropertySetter, BfCheckedKind_NotSet, mPropTarget) != NULL;
auto autoFieldName = curCheckType->mTypeDef->GetAutoPropertyName(propertyDeclaration);
auto result = LookupField(targetSrc, target, autoFieldName, (BfLookupFieldFlags)(BfLookupFieldFlag_IgnoreProtection | BfLookupFieldFlag_IsImplicitThis));
if (result)
BfMethodDef* getter = GetPropertyMethodDef(mPropDef, BfMethodType_PropertySetter, BfCheckedKind_NotSet, mPropTarget);
BfMethodDef* setter = GetPropertyMethodDef(mPropDef, BfMethodType_PropertySetter, BfCheckedKind_NotSet, mPropTarget);
bool optAllowed = true;
if ((getter != NULL) && (getter->mBody != NULL))
optAllowed = false;
if ((setter != NULL) && (setter->mBody != NULL))
optAllowed = false;
if (optAllowed)
{
bool needsCopy = true;
if (!hasSetter)
auto autoFieldName = curCheckType->mTypeDef->GetAutoPropertyName(propertyDeclaration);
auto result = LookupField(targetSrc, target, autoFieldName, (BfLookupFieldFlags)(BfLookupFieldFlag_IgnoreProtection | BfLookupFieldFlag_IsImplicitThis));
if (result)
{
if (((mModule->mCurMethodInstance->mMethodDef->mMethodType == BfMethodType_Ctor)) &&
(startCheckType == mModule->mCurTypeInstance))
bool needsCopy = true;
if (setter == NULL)
{
// Allow writing inside ctor
}
else
{
result.MakeReadOnly();
needsCopy = false;
if (((mModule->mCurMethodInstance->mMethodDef->mMethodType == BfMethodType_Ctor)) &&
(startCheckType == mModule->mCurTypeInstance))
{
// Allow writing inside ctor
}
else
{
result.MakeReadOnly();
needsCopy = false;
}
}
if (result.mKind == BfTypedValueKind_Addr)
result.mKind = BfTypedValueKind_CopyOnMutateAddr;
mPropDef = NULL;
mPropSrc = NULL;
mOrigPropTarget = NULL;
return result;
}
if (result.mKind == BfTypedValueKind_Addr)
result.mKind = BfTypedValueKind_CopyOnMutateAddr;
mPropDef = NULL;
mPropSrc = NULL;
mOrigPropTarget = NULL;
return result;
}
}
}