Browse Source

Add MethodCodeType argument to MethodImplAttribute.

pull/2693/head
Siegfried Pammer 3 years ago
parent
commit
e61f46c474
  1. 6
      ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs
  2. 92
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/MetadataAttributes.cs
  3. 14
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataMethod.cs

6
ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs

@ -714,6 +714,12 @@ namespace ICSharpCode.Decompiler.Tests @@ -714,6 +714,12 @@ namespace ICSharpCode.Decompiler.Tests
await RunForLibrary(cscOptions: cscOptions | CompilerOptions.Preview);
}
[Test]
public async Task MetadataAttributes([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions)
{
await RunForLibrary(cscOptions: cscOptions);
}
async Task RunForLibrary([CallerMemberName] string testName = null, AssemblerOptions asmOptions = AssemblerOptions.None, CompilerOptions cscOptions = CompilerOptions.None, DecompilerSettings decompilerSettings = null)
{
await Run(testName, asmOptions | AssemblerOptions.Library, cscOptions | CompilerOptions.Library, decompilerSettings);

92
ICSharpCode.Decompiler.Tests/TestCases/Pretty/MetadataAttributes.cs

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
internal class MetadataAttributes
{
private class MethodImplAttr
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public extern void A();
#if NETCORE
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public extern void B();
#endif
[MethodImpl(MethodImplOptions.ForwardRef)]
public extern void D();
[MethodImpl(MethodImplOptions.InternalCall)]
public extern void E();
[MethodImpl(MethodImplOptions.NoInlining)]
public extern void F();
[MethodImpl(MethodImplOptions.NoOptimization)]
public extern void G();
[PreserveSig]
public extern void H();
[MethodImpl(MethodImplOptions.Synchronized)]
public extern void I();
[MethodImpl(MethodImplOptions.Unmanaged)]
public extern void J();
[MethodImpl(MethodImplOptions.AggressiveInlining, MethodCodeType = MethodCodeType.Native)]
public extern void A1();
#if NETCORE
[MethodImpl(MethodImplOptions.AggressiveOptimization, MethodCodeType = MethodCodeType.Native)]
public extern void B1();
#endif
[MethodImpl(MethodImplOptions.ForwardRef, MethodCodeType = MethodCodeType.Native)]
public extern void D1();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Native)]
public extern void E1();
[MethodImpl(MethodImplOptions.NoInlining, MethodCodeType = MethodCodeType.Native)]
public extern void F1();
[MethodImpl(MethodImplOptions.NoOptimization, MethodCodeType = MethodCodeType.Native)]
public extern void G1();
[MethodImpl(MethodImplOptions.PreserveSig, MethodCodeType = MethodCodeType.Native)]
public extern void H1();
[MethodImpl(MethodImplOptions.Synchronized, MethodCodeType = MethodCodeType.Native)]
public extern void I1();
[MethodImpl(MethodImplOptions.Unmanaged, MethodCodeType = MethodCodeType.Native)]
public extern void J1();
[MethodImpl(MethodImplOptions.AggressiveInlining, MethodCodeType = MethodCodeType.OPTIL)]
public extern void A2();
#if NETCORE
[MethodImpl(MethodImplOptions.AggressiveOptimization, MethodCodeType = MethodCodeType.OPTIL)]
public extern void B2();
#endif
[MethodImpl(MethodImplOptions.ForwardRef, MethodCodeType = MethodCodeType.OPTIL)]
public extern void D2();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.OPTIL)]
public extern void E2();
[MethodImpl(MethodImplOptions.NoInlining, MethodCodeType = MethodCodeType.OPTIL)]
public extern void F2();
[MethodImpl(MethodImplOptions.NoOptimization, MethodCodeType = MethodCodeType.OPTIL)]
public extern void G2();
[MethodImpl(MethodImplOptions.PreserveSig, MethodCodeType = MethodCodeType.OPTIL)]
public extern void H2();
[MethodImpl(MethodImplOptions.Synchronized, MethodCodeType = MethodCodeType.OPTIL)]
public extern void I2();
[MethodImpl(MethodImplOptions.Unmanaged, MethodCodeType = MethodCodeType.OPTIL)]
public extern void J2();
[MethodImpl(MethodImplOptions.AggressiveInlining, MethodCodeType = MethodCodeType.OPTIL)]
public extern void A3();
#if NETCORE
[MethodImpl(MethodImplOptions.AggressiveOptimization, MethodCodeType = MethodCodeType.Runtime)]
public extern void B3();
#endif
[MethodImpl(MethodImplOptions.ForwardRef, MethodCodeType = MethodCodeType.Runtime)]
public extern void D3();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
public extern void E3();
[MethodImpl(MethodImplOptions.NoInlining, MethodCodeType = MethodCodeType.Runtime)]
public extern void F3();
[MethodImpl(MethodImplOptions.NoOptimization, MethodCodeType = MethodCodeType.Runtime)]
public extern void G3();
[MethodImpl(MethodImplOptions.PreserveSig, MethodCodeType = MethodCodeType.Runtime)]
public extern void H3();
[MethodImpl(MethodImplOptions.Synchronized, MethodCodeType = MethodCodeType.Runtime)]
public extern void I3();
[MethodImpl(MethodImplOptions.Unmanaged, MethodCodeType = MethodCodeType.Runtime)]
public extern void J3();
}
}
}

14
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataMethod.cs

@ -333,6 +333,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -333,6 +333,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
var metadata = module.metadata;
var def = metadata.GetMethodDefinition(handle);
MethodImplAttributes implAttributes = def.ImplAttributes & ~MethodImplAttributes.CodeTypeMask;
int methodCodeType = (int)(def.ImplAttributes & MethodImplAttributes.CodeTypeMask);
#region DllImportAttribute
var info = def.GetImport();
@ -430,7 +431,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -430,7 +431,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
#endregion
#region PreserveSigAttribute
if (implAttributes == MethodImplAttributes.PreserveSig)
if (implAttributes == MethodImplAttributes.PreserveSig && methodCodeType == 0)
{
b.Add(KnownAttribute.PreserveSig);
implAttributes = 0;
@ -440,10 +441,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -440,10 +441,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
#region MethodImplAttribute
if (implAttributes != 0)
{
b.Add(KnownAttribute.MethodImpl,
new TopLevelTypeName("System.Runtime.CompilerServices", nameof(MethodImplOptions)),
(int)implAttributes
);
var methodImpl = new AttributeBuilder(module, KnownAttribute.MethodImpl);
methodImpl.AddFixedArg(new TopLevelTypeName("System.Runtime.CompilerServices", nameof(MethodImplOptions)), (int)implAttributes);
if (methodCodeType != 0)
{
methodImpl.AddNamedArg("MethodCodeType", new TopLevelTypeName("System.Runtime.CompilerServices", nameof(MethodCodeType)), methodCodeType);
}
b.Add(methodImpl.Build());
}
#endregion

Loading…
Cancel
Save