Browse Source

Add "Aggressive inlining" option

pull/2113/head
Daniel Grunwald 5 years ago
parent
commit
cc850c27aa
  1. 19
      ICSharpCode.Decompiler/DecompilerSettings.cs
  2. 10
      ICSharpCode.Decompiler/IL/Transforms/ILInlining.cs
  3. 2
      ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs

19
ICSharpCode.Decompiler/DecompilerSettings.cs

@ -1423,6 +1423,25 @@ namespace ICSharpCode.Decompiler @@ -1423,6 +1423,25 @@ namespace ICSharpCode.Decompiler
}
}
bool aggressiveInlining = false;
/// <summary>
/// If set to false (the default), the decompiler will inline local variables only when they occur
/// in a context where the C# compiler is known to emit compiler-generated locals.
/// If set to true, the decompiler will inline local variables whenever possible.
/// </summary>
[Category("DecompilerSettings.Other")]
[Description("DecompilerSettings.AggressiveInlining")]
public bool AggressiveInlining {
get { return aggressiveInlining; }
set {
if (aggressiveInlining != value) {
aggressiveInlining = value;
OnPropertyChanged();
}
}
}
CSharpFormattingOptions csharpFormattingOptions;
[Browsable(false)]

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

@ -53,15 +53,15 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -53,15 +53,15 @@ namespace ICSharpCode.Decompiler.IL.Transforms
public void Run(Block block, int pos, StatementTransformContext context)
{
InlineOneIfPossible(block, pos, OptionsForBlock(block, pos), context: context);
InlineOneIfPossible(block, pos, OptionsForBlock(block, pos, context), context: context);
}
internal static InliningOptions OptionsForBlock(Block block, int pos)
internal static InliningOptions OptionsForBlock(Block block, int pos, ILTransformContext context)
{
InliningOptions options = InliningOptions.None;
if (IsCatchWhenBlock(block))
if (context.Settings.AggressiveInlining || IsCatchWhenBlock(block)) {
options |= InliningOptions.Aggressive;
else {
} else {
var function = block.Ancestors.OfType<ILFunction>().FirstOrDefault();
var inst = block.Instructions[pos];
if (IsInConstructorInitializer(function, inst))
@ -77,7 +77,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -77,7 +77,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
for (int i = instructions.Count - 1; i >= 0; i--) {
if (instructions[i] is StLoc inst) {
InliningOptions options = InliningOptions.None;
if (IsCatchWhenBlock(block) || IsInConstructorInitializer(function, inst))
if (context.Settings.AggressiveInlining || IsCatchWhenBlock(block) || IsInConstructorInitializer(function, inst))
options = InliningOptions.Aggressive;
if (InlineOneIfPossible(block, i, options, context)) {
modified = true;

2
ICSharpCode.Decompiler/IL/Transforms/NamedArgumentTransform.cs

@ -106,7 +106,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -106,7 +106,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
{
if (!context.Settings.NamedArguments)
return;
var options = ILInlining.OptionsForBlock(block, pos);
var options = ILInlining.OptionsForBlock(block, pos, context);
options |= InliningOptions.IntroduceNamedArguments;
ILInlining.InlineOneIfPossible(block, pos, options, context: context);
}

Loading…
Cancel
Save