Skip to content

Commit 1cfa42f

Browse files
committed
fix: Refine iterator and async method body scanning
Instead of resolving the first newobj instruction, search all newobj instructions for the first type that actually declares a MoveNext method. This prevents picking up an unrelated compiler-generated object. Fixes #280 Signed-off-by: Optano-Dev <69143350+Optano-Dev@users.noreply.github.com>
1 parent 312f823 commit 1cfa42f

1 file changed

Lines changed: 23 additions & 7 deletions

File tree

ArchUnitNET/Loader/TypeProcessor.cs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -864,9 +864,20 @@ private static void HandleIterator(
864864
DomainResolver domainResolver
865865
)
866866
{
867-
var compilerGeneratedGeneratorObject = (
868-
(MethodReference)methodBody.Instructions.First(inst => inst.IsNewObjectOp()).Operand
869-
).DeclaringType.Resolve();
867+
var compilerGeneratedGeneratorObject = methodBody
868+
.Instructions.Where(inst => inst.IsNewObjectOp())
869+
.Select(inst => ((MethodReference)inst.Operand).DeclaringType.Resolve())
870+
.FirstOrDefault(type =>
871+
type != null
872+
&& type.Methods.Any(method => method.Name == nameof(IEnumerator.MoveNext))
873+
);
874+
875+
if (compilerGeneratedGeneratorObject == null)
876+
{
877+
methodDefinition = methodBody.Method;
878+
return;
879+
}
880+
870881
methodDefinition = compilerGeneratedGeneratorObject.Methods.First(method =>
871882
method.Name == nameof(IEnumerator.MoveNext)
872883
);
@@ -898,10 +909,15 @@ private static void HandleAsync(
898909
DomainResolver domainResolver
899910
)
900911
{
901-
var compilerGeneratedGeneratorObject = (
902-
(MethodReference)
903-
methodBody.Instructions.FirstOrDefault(inst => inst.IsNewObjectOp())?.Operand
904-
)?.DeclaringType.Resolve();
912+
var compilerGeneratedGeneratorObject = methodBody
913+
.Instructions.Where(inst => inst.IsNewObjectOp())
914+
.Select(inst => ((MethodReference)inst.Operand).DeclaringType.Resolve())
915+
.FirstOrDefault(type =>
916+
type != null
917+
&& type.Methods.Any(method =>
918+
method.Name == nameof(IAsyncStateMachine.MoveNext)
919+
)
920+
);
905921

906922
if (compilerGeneratedGeneratorObject == null)
907923
{

0 commit comments

Comments
 (0)