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

Fixed LoadProperty for struct pointers

This commit is contained in:
Brian Fiete 2023-06-28 16:21:37 -04:00
parent ba0ff23e9d
commit 1aa99da714
2 changed files with 46 additions and 8 deletions

View file

@ -4798,6 +4798,13 @@ BfTypedValue BfExprEvaluator::TryArrowLookup(BfTypedValue typedValue, BfTokenNod
BfTypedValue BfExprEvaluator::LoadProperty(BfAstNode* targetSrc, BfTypedValue target, BfTypeInstance* typeInstance, BfPropertyDef* prop, BfLookupFieldFlags flags, BfCheckedKind checkedKind, bool isInlined)
{
BfTypedValue origTarget = target;
if (target.mType->IsStructPtr())
{
target = mModule->LoadValue(target);
target = BfTypedValue(target.mValue, target.mType->GetUnderlyingType(), target.IsReadOnly() ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
}
if ((flags & BfLookupFieldFlag_IsAnonymous) == 0)
mModule->SetElementType(targetSrc, BfSourceElementType_Method);
@ -4832,7 +4839,7 @@ BfTypedValue BfExprEvaluator::LoadProperty(BfAstNode* targetSrc, BfTypedValue ta
mModule->Fail(StrFormat("Property '%s.%s' cannot be accessed with an instance reference; qualify it with a type name instead",
mModule->TypeToString(typeInstance).c_str(), mPropDef->mName.c_str()), targetSrc);
}
}
}
bool isBaseLookup = (target.mType) && (typeInstance != target.mType);
if ((isBaseLookup) && (target.mType->IsWrappableType()))
@ -4853,18 +4860,23 @@ BfTypedValue BfExprEvaluator::LoadProperty(BfAstNode* targetSrc, BfTypedValue ta
}
}
else
mPropTarget = target;
if (mPropTarget.mType->IsStructPtr())
{
mPropTarget = mModule->LoadValue(mPropTarget);
mPropTarget = BfTypedValue(mPropTarget.mValue, mPropTarget.mType->GetUnderlyingType(), mPropTarget.IsReadOnly() ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
}
mPropTarget = target;
mOrigPropTarget = mPropTarget;
if (prop->mIsStatic)
mOrigPropTarget = target;
#ifdef _DEBUG
if (mPropTarget)
{
auto propTargetTypeInst = mPropTarget.mType->ToTypeInstance();
if (propTargetTypeInst != NULL)
{
BF_ASSERT(prop->mDeclaringType->mFullNameEx == propTargetTypeInst->mTypeDef->mFullNameEx);
}
}
#endif
if ((flags & BfLookupFieldFlag_IsAnonymous) == 0)
{
auto autoComplete = GetAutoComplete();
@ -19167,6 +19179,8 @@ BfModuleMethodInstance BfExprEvaluator::GetPropertyMethodInstance(BfMethodDef* m
return BfModuleMethodInstance();
}
BF_ASSERT(propTypeInst->mTypeDef->mFullNameEx == methodDef->mDeclaringType->mFullNameEx);
return mModule->GetMethodInstance(propTypeInst, methodDef, BfTypeVector(), mPropGetMethodFlags);
}