Browse Source

Add hack to allow inlining of compiler-generated variable after dynamic.isevent pattern transform.

pull/1165/head
Siegfried Pammer 7 years ago
parent
commit
2c7e3c2c37
  1. 11
      ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs

11
ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs

@ -379,12 +379,20 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return false; return false;
if (!invokeMember.Arguments[0].Match(getMember.Target).Success) if (!invokeMember.Arguments[0].Match(getMember.Target).Success)
return false; return false;
context.Step("+= / -= dynamic.isevent pattern -> dynamic.compound.op", inst);
inst.ReplaceWith(dynamicCompoundAssign); inst.ReplaceWith(dynamicCompoundAssign);
if (getMember.Target.MatchLdLoc(out var v) && v.Kind == VariableKind.Local && v.IsSingleDefinition && v.LoadCount == 1 && v.StoreInstructions[0] is StLoc initStore) {
if (ILInlining.CanInlineInto(dynamicCompoundAssign, v, initStore.Value)) {
// HACK: if inlining is possible, we can 'cheat' a bit and change the variable kind to StackSlot
// so inlining or copy propagation will take care of the extra compiler-generated local.
v.Kind = VariableKind.StackSlot;
}
}
return true; return true;
} }
/// <summary> /// <summary>
/// dynamic.setmember.compound Name(target, dynamic.binary.operator AddAssign(dynamic.getmember Name(target), value)) /// dynamic.setmember.compound Name(target, dynamic.binary.operator op(dynamic.getmember Name(target), value))
/// => /// =>
/// dynamic.compound.op (dynamic.getmember Name(target), value) /// dynamic.compound.op (dynamic.getmember Name(target), value)
/// </summary> /// </summary>
@ -410,6 +418,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
base.VisitDynamicSetMemberInstruction(inst); base.VisitDynamicSetMemberInstruction(inst);
return; return;
} }
context.Step("dynamic.setmember.compound -> dynamic.compound.op", inst);
inst.ReplaceWith(new DynamicCompoundAssign(binaryOp.Operation, binaryOp.Left, binaryOp.LeftArgumentInfo, binaryOp.Right, binaryOp.RightArgumentInfo)); inst.ReplaceWith(new DynamicCompoundAssign(binaryOp.Operation, binaryOp.Left, binaryOp.LeftArgumentInfo, binaryOp.Right, binaryOp.RightArgumentInfo));
} }

Loading…
Cancel
Save