Browse Source

Fix #1325: Do not perform inline assignment transform on setter calls, that belong to parameterized properties.

pull/1347/head
Siegfried Pammer 7 years ago
parent
commit
667e04462a
  1. 2
      ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj
  2. 6
      ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs
  3. 74
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1325.cs
  4. 221
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1325.il
  5. 29
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1325.vb
  6. 10
      ICSharpCode.Decompiler/IL/Transforms/TransformAssignment.cs

2
ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj

@ -73,6 +73,7 @@ @@ -73,6 +73,7 @@
<Compile Include="TestCases\Correctness\RefLocalsAndReturns.cs" />
<Compile Include="TestCases\ILPretty\Issue1256.cs" />
<Compile Include="TestCases\ILPretty\Issue1323.cs" />
<None Include="TestCases\ILPretty\Issue1325.cs" />
<Compile Include="TestCases\Pretty\ConstantsTests.cs" />
<Compile Include="TestCases\Pretty\CS73_StackAllocInitializers.cs" />
<Compile Include="TestCases\Pretty\OptionalArguments.cs" />
@ -82,6 +83,7 @@ @@ -82,6 +83,7 @@
<Compile Include="TestCases\Pretty\YieldReturn.cs" />
<None Include="TestCases\ILPretty\Issue1256.il" />
<None Include="TestCases\ILPretty\Issue1323.il" />
<None Include="TestCases\ILPretty\Issue1325.il" />
<None Include="TestCases\Ugly\NoDecimalConstants.Expected.cs" />
<Compile Include="TestCases\Ugly\NoDecimalConstants.cs" />
<None Include="TestCases\Disassembler\Pretty\SecurityDeclarations.il" />

6
ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs

@ -130,6 +130,12 @@ namespace ICSharpCode.Decompiler.Tests @@ -130,6 +130,12 @@ namespace ICSharpCode.Decompiler.Tests
Run();
}
[Test]
public void Issue1325()
{
Run();
}
[Test]
public void FSharpLoops_Debug()
{

74
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1325.cs

@ -0,0 +1,74 @@ @@ -0,0 +1,74 @@
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
[assembly: Embedded]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: TargetFramework(".NETCoreApp,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
namespace Microsoft.VisualBasic
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class, Inherited = false)]
[CompilerGenerated]
[EditorBrowsable(EditorBrowsableState.Never)]
[Embedded]
internal sealed class Embedded : Attribute
{
}
}
namespace Issue1325
{
[StandardModule]
internal sealed class Program
{
[STAThread]
public static void Main(string[] args)
{
}
public static void TestCode(Test t, int i)
{
string str = "";
str += File.ReadAllText("Test.txt");
str += "asdf";
t.set_Parameterized(i, str);
t.Unparameterized = str + "asdf";
}
}
}
namespace Microsoft.VisualBasic.CompilerServices
{
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
[CompilerGenerated]
[Embedded]
internal sealed class StandardModuleAttribute : Attribute
{
}
}
namespace Issue1325
{
internal class Test
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[CompilerGenerated]
private string _Unparameterized;
public string Parameterized {
get {
throw new NotImplementedException();
}
set {
throw new NotImplementedException();
}
}
public string Unparameterized {
get;
set;
}
}
}

221
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1325.il

@ -0,0 +1,221 @@ @@ -0,0 +1,221 @@
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
// Copyright (c) Microsoft Corporation. All rights reserved.
// Metadata version: v4.0.30319
.assembly extern System.Runtime
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 4:2:1:0
}
.assembly extern System.Diagnostics.Debug
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 4:1:1:0
}
.assembly extern System.IO.FileSystem
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 4:1:1:0
}
.assembly Issue1325
{
.custom instance void Microsoft.VisualBasic.Embedded::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 18 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 // ....NETCoreApp,V
65 72 73 69 6F 6E 3D 76 32 2E 31 01 00 54 0E 14 // ersion=v2.1..T..
46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 79 // FrameworkDisplay
4E 61 6D 65 00 ) // Name.
.custom instance void [System.Runtime]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 05 44 65 62 75 67 00 00 ) // ...Debug..
.custom instance void [System.Runtime]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0..
.custom instance void [System.Runtime]System.Reflection.AssemblyInformationalVersionAttribute::.ctor(string) = ( 01 00 05 31 2E 30 2E 30 00 00 ) // ...1.0.0..
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module Issue1325.dll
// MVID: {CE79A917-9454-47A4-8FF9-0348706BB573}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x01240000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi sealed Issue1325.Program
extends [System.Runtime]System.Object
{
.custom instance void Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute::.ctor() = ( 01 00 00 00 )
.method public static void Main(string[] args) cil managed
{
.entrypoint
.custom instance void [System.Runtime]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::Main
.method public static void TestCode(class Issue1325.Test t,
int32 i) cil managed
{
// Code size 64 (0x40)
.maxstack 3
.locals init (string V_0)
IL_0000: nop
IL_0001: ldstr ""
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "Test.txt"
IL_000d: call string [System.IO.FileSystem]System.IO.File::ReadAllText(string)
IL_0012: call string [System.Runtime]System.String::Concat(string,
string)
IL_0017: stloc.0
IL_0018: ldloc.0
IL_0019: ldstr "asdf"
IL_001e: call string [System.Runtime]System.String::Concat(string,
string)
IL_0023: stloc.0
IL_0024: ldarg.0
IL_0025: ldarg.1
IL_0026: ldloc.0
IL_0027: callvirt instance void Issue1325.Test::set_Parameterized(int32,
string)
IL_002c: nop
IL_002d: ldarg.0
IL_002e: ldloc.0
IL_002f: ldstr "asdf"
IL_0034: call string [System.Runtime]System.String::Concat(string,
string)
IL_0039: callvirt instance void Issue1325.Test::set_Unparameterized(string)
IL_003e: nop
IL_003f: ret
} // end of method Program::TestCode
} // end of class Issue1325.Program
.class private auto ansi Issue1325.Test
extends [System.Runtime]System.Object
{
.field private string _Unparameterized
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Diagnostics.Debug]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [System.Diagnostics.Debug]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.method public specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
IL_0006: ret
} // end of method Test::.ctor
.method public specialname instance string
get_Parameterized(int32 i) cil managed
{
// Code size 7 (0x7)
.maxstack 1
.locals init (string V_0)
IL_0000: nop
IL_0001: newobj instance void [System.Runtime]System.NotImplementedException::.ctor()
IL_0006: throw
} // end of method Test::get_Parameterized
.method public specialname instance void
set_Parameterized(int32 i,
string 'value') cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: nop
IL_0001: newobj instance void [System.Runtime]System.NotImplementedException::.ctor()
IL_0006: throw
} // end of method Test::set_Parameterized
.method public specialname instance string
get_Unparameterized() cil managed
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 9 (0x9)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld string Issue1325.Test::_Unparameterized
IL_0006: br.s IL_0008
IL_0008: ret
} // end of method Test::get_Unparameterized
.method public specialname instance void
set_Unparameterized(string AutoPropertyValue) cil managed
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld string Issue1325.Test::_Unparameterized
IL_0007: ret
} // end of method Test::set_Unparameterized
.property instance string Parameterized(int32)
{
.get instance string Issue1325.Test::get_Parameterized(int32)
.set instance void Issue1325.Test::set_Parameterized(int32,
string)
} // end of property Test::Parameterized
.property instance string Unparameterized()
{
.get instance string Issue1325.Test::get_Unparameterized()
.set instance void Issue1325.Test::set_Unparameterized(string)
} // end of property Test::Unparameterized
} // end of class Issue1325.Test
.class private auto ansi sealed Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute
extends [System.Runtime]System.Attribute
{
.custom instance void Microsoft.VisualBasic.Embedded::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.AttributeUsageAttribute::.ctor(valuetype [System.Runtime]System.AttributeTargets) = ( 01 00 04 00 00 00 01 00 54 02 09 49 6E 68 65 72 // ........T..Inher
69 74 65 64 00 ) // ited.
.custom instance void [System.Runtime]System.ComponentModel.EditorBrowsableAttribute::.ctor(valuetype [System.Runtime]System.ComponentModel.EditorBrowsableState) = ( 01 00 01 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.method public specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Runtime]System.Attribute::.ctor()
IL_0006: ret
} // end of method StandardModuleAttribute::.ctor
} // end of class Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute
.class private auto ansi sealed Microsoft.VisualBasic.Embedded
extends [System.Runtime]System.Attribute
{
.custom instance void Microsoft.VisualBasic.Embedded::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.AttributeUsageAttribute::.ctor(valuetype [System.Runtime]System.AttributeTargets) = ( 01 00 07 00 00 00 01 00 54 02 09 49 6E 68 65 72 // ........T..Inher
69 74 65 64 00 ) // ited.
.custom instance void [System.Runtime]System.ComponentModel.EditorBrowsableAttribute::.ctor(valuetype [System.Runtime]System.ComponentModel.EditorBrowsableState) = ( 01 00 01 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.method public specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Runtime]System.Attribute::.ctor()
IL_0006: ret
} // end of method Embedded::.ctor
} // end of class Microsoft.VisualBasic.Embedded

29
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1325.vb

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
Imports System
Imports System.IO
Module Program
Sub Main(args As String())
End Sub
Sub TestCode(ByVal t As Test, ByVal i As Integer)
Dim s As String = ""
s += File.ReadAllText("Test.txt")
s += "asdf"
t.Parameterized(i) = s
t.Unparameterized = s + "asdf"
End Sub
End Module
Class Test
Public Property Parameterized(ByVal i As Integer) As String
Get
Throw New NotImplementedException()
End Get
Set(value As String)
Throw New NotImplementedException()
End Set
End Property
Public Property Unparameterized As String
End Class

10
ICSharpCode.Decompiler/IL/Transforms/TransformAssignment.cs

@ -138,8 +138,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -138,8 +138,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return false;
if (call.ResultType != StackType.Void || call.Arguments.Count == 0)
return false;
if (!call.Method.Equals((call.Method.AccessorOwner as IProperty)?.Setter))
IProperty property = call.Method.AccessorOwner as IProperty;
if (property == null)
return false;
if (!call.Method.Equals(property.Setter))
return false;
if (!(property.IsIndexer || property.Setter.Parameters.Count == 1)) {
// this is a parameterized property, which cannot be expressed as C# code.
// setter calls are not valid in expression context, if property syntax cannot be used.
return false;
}
if (!call.Arguments.Last().MatchLdLoc(inst.Variable))
return false;
foreach (var arg in call.Arguments.SkipLast(1)) {

Loading…
Cancel
Save