diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 794c2241..b5e621b4 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -11957,8 +11957,8 @@ void BfExprEvaluator::Visit(BfDelegateBindExpression* delegateBindExpr) if (bindResult.mTarget.IsSplat()) target = mModule->AggregateSplat(bindResult.mTarget, &bindResult.mIRArgs[0]); else - target = mModule->LoadValue(bindResult.mTarget); - + target = bindResult.mTarget; + mModule->mBfIRBuilder->CreateStore(target.mValue, elemPtr); mResult = BfTypedValue(methodRefPtr, methodRefType, true); diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index 57c74d92..701a3a75 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -2631,6 +2631,8 @@ void BfIRBuilder::CreateTypeDeclaration(BfType* type, bool forceDbgDefine) if (methodInstance != NULL) name += BfTypeUtils::HashEncode64(methodInstance->mIdHash).c_str(); + BF_ASSERT(methodInstance != NULL); + if ((wantDIData) && (methodInstance != NULL)) { auto typeDeclaration = methodInstance->GetOwner()->mTypeDef->mTypeDeclaration; diff --git a/IDEHelper/Tests/src/FuncRefs.bf b/IDEHelper/Tests/src/FuncRefs.bf index 0a5969d0..76dedf7c 100644 --- a/IDEHelper/Tests/src/FuncRefs.bf +++ b/IDEHelper/Tests/src/FuncRefs.bf @@ -69,9 +69,21 @@ namespace Tests { } + class Invoker + { + public int mA = 111; + + public void Invoke() + { + mA += 222; + } + } + class TestA { Vector2 mVec = .(11, 22); + Event mEvt ~ _.Dispose(); + Action mAct; public Vector2 Vec { @@ -84,6 +96,17 @@ namespace Tests Test.Assert(value.x == 33); Test.Assert(value.y == 44); }); + Invoker invoker = scope .(); + mEvt.Add(new => invoker); + DoIt(=> mEvt); + Test.Assert(invoker.mA == 333); + DoIt(=> invoker); + Test.Assert(invoker.mA == 555); + mAct = scope => invoker; + mAct(); + Test.Assert(invoker.mA == 777); + DoIt(=> mAct); + Test.Assert(invoker.mA == 999); } }