From 981e56baada21dc40d017ccb4f670c7d72d6904a Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 20 Jan 2021 07:51:59 -0800 Subject: [PATCH] Properly make a copy during autoprop direct field access optimization --- IDEHelper/Compiler/BfExprEvaluator.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index c0c10ef0..d26f8470 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4832,6 +4832,8 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar auto result = LookupField(targetSrc, target, autoFieldName, BfLookupFieldFlag_IgnoreProtection); if (result) { + bool needsCopy = true; + if (!hasSetter) { if (((mModule->mCurMethodInstance->mMethodDef->mMethodType == BfMethodType_Ctor)) && @@ -4840,11 +4842,22 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar // Allow writing inside ctor } else + { result.MakeReadOnly(); + needsCopy = false; + } } + + if (needsCopy) + { + result = mModule->LoadValue(result); + result = mModule->MakeAddressable(result); + result = mModule->RemoveReadOnly(result); + } + mPropDef = NULL; mPropSrc = NULL; - mOrigPropTarget = NULL; + mOrigPropTarget = NULL; return result; } }