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
} }
} }
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; CSharpFormattingOptions csharpFormattingOptions;
[Browsable(false)] [Browsable(false)]

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

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

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

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

Loading…
Cancel
Save