From 50686097fbbe4520fe6022fb10d6c4ba04d364e1 Mon Sep 17 00:00:00 2001 From: fcurdi Date: Sat, 16 May 2020 11:30:17 -0300 Subject: [PATCH] add IsVirtual property to IMethodReference --- MetadataProvider/AssemblyExtractor.cs | 20 ++++++++++++++++++-- Model/Types/TypeDefinitions.cs | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/MetadataProvider/AssemblyExtractor.cs b/MetadataProvider/AssemblyExtractor.cs index 66787d90..f058f90f 100644 --- a/MetadataProvider/AssemblyExtractor.cs +++ b/MetadataProvider/AssemblyExtractor.cs @@ -971,8 +971,10 @@ private IInstruction ExtractInstruction(ILInstruction operation) break; case SRM.ILOpCode.Ldftn: + instruction = ProcessLoadMethodAddress(operation, false); + break; case SRM.ILOpCode.Ldvirtftn: - instruction = ProcessLoadMethodAddress(operation); + instruction = ProcessLoadMethodAddress(operation, true); break; case SRM.ILOpCode.Ldc_i4: @@ -1573,10 +1575,24 @@ private IInstruction ProcessLoadField(ILInstruction op) return instruction; } - private IInstruction ProcessLoadMethodAddress(ILInstruction op) + private IInstruction ProcessLoadMethodAddress(ILInstruction op, bool isVirtual) { var operation = OperationHelper.ToLoadMethodAddressOperation(op.Opcode); var method = GetOperand(op); + switch (method) + { + case MethodDefinition methodDefinition: + { + methodDefinition.IsVirtual = isVirtual; + break; + } + case MethodReference methodReference: + { + methodReference.IsVirtual = isVirtual; + break; + } + default: throw new Exception("case not handled"); + } var instruction = new LoadMethodAddressInstruction(op.Offset, operation, method); return instruction; diff --git a/Model/Types/TypeDefinitions.cs b/Model/Types/TypeDefinitions.cs index 27062ea7..752a3540 100644 --- a/Model/Types/TypeDefinitions.cs +++ b/Model/Types/TypeDefinitions.cs @@ -286,6 +286,7 @@ public interface IMethodReference : ITypeMemberReference, IMetadataReference, IG IMethodReference GenericMethod { get; } MethodDefinition ResolvedMethod { get; } bool IsStatic { get; } + bool IsVirtual { get; } } public class MethodReference : IMethodReference @@ -302,6 +303,7 @@ public class MethodReference : IMethodReference public IList Parameters { get; private set; } public IMethodReference GenericMethod { get; set; } public bool IsStatic { get; set; } + public bool IsVirtual { get; set; } public MethodReference(string name, IType returnType) {