Browse Source

Fix #3134: Include newobj, initobj and call instructions in TypeInstantiatedByAnalyzer

pull/3307/head
Siegfried Pammer 7 months ago
parent
commit
280d17332f
  1. 55
      ICSharpCode.ILSpyX/Analyzers/Builtin/TypeInstantiatedByAnalyzer.cs

55
ICSharpCode.ILSpyX/Analyzers/Builtin/TypeInstantiatedByAnalyzer.cs

@ -23,7 +23,6 @@ using System.Diagnostics; @@ -23,7 +23,6 @@ using System.Diagnostics;
using System.Linq;
using System.Reflection.Metadata;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
@ -106,47 +105,67 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin @@ -106,47 +105,67 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
while (blob.RemainingBytes > 0)
{
ILOpCode opCode;
EntityHandle handle;
try
{
opCode = blob.DecodeOpCode();
if (!CanBeReference(opCode))
switch (opCode)
{
blob.SkipOperand(opCode);
continue;
case ILOpCode.Newobj:
case ILOpCode.Call when analyzedEntity.Kind == TypeKind.Struct:
case ILOpCode.Initobj:
handle = MetadataTokenHelpers.EntityHandleOrNil(blob.ReadInt32());
break;
default:
blob.SkipOperand(opCode);
continue;
}
}
catch (BadImageFormatException)
{
return false;
}
EntityHandle methodHandle = MetadataTokenHelpers.EntityHandleOrNil(blob.ReadInt32());
if (!methodHandle.Kind.IsMemberKind())
continue;
IMethod ctor;
}
ITypeDefinition? foundTypeDefinition;
try
{
ctor = module.ResolveMethod(methodHandle, genericContext);
switch (handle.Kind)
{
case HandleKind.MethodDefinition:
case HandleKind.MemberReference:
var ctor = module.ResolveMethod(handle, genericContext);
if (ctor == null || !ctor.IsConstructor)
{
continue;
}
foundTypeDefinition = ctor.DeclaringTypeDefinition;
break;
case HandleKind.TypeDefinition:
case HandleKind.TypeReference:
foundTypeDefinition = module.ResolveType(handle, genericContext)?.GetDefinition();
break;
default:
continue;
}
}
catch (BadImageFormatException)
{
continue;
}
if (ctor == null || !ctor.IsConstructor)
if (foundTypeDefinition?.ParentModule == null)
{
continue;
}
if (ctor.DeclaringTypeDefinition?.MetadataToken == analyzedEntity.MetadataToken
&& ctor.ParentModule?.MetadataFile == analyzedEntity.ParentModule!.MetadataFile)
if (foundTypeDefinition.MetadataToken == analyzedEntity.MetadataToken
&& foundTypeDefinition.ParentModule.MetadataFile == analyzedEntity.ParentModule!.MetadataFile)
{
return true;
}
}
return false;
}
bool CanBeReference(ILOpCode opCode)
{
return opCode == ILOpCode.Newobj || opCode == ILOpCode.Initobj;
}
public bool Show(ISymbol symbol) => symbol is ITypeDefinition entity && !entity.IsAbstract && !entity.IsStatic;
}
}

Loading…
Cancel
Save