Browse Source

Add addressof(ldloc V) => ldloca V transform for read access on value types.

pull/1586/head
Siegfried Pammer 7 years ago
parent
commit
119c679fad
  1. 16
      ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs

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

@ -389,6 +389,22 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -389,6 +389,22 @@ namespace ICSharpCode.Decompiler.IL.Transforms
{
base.VisitLdObj(inst);
EarlyExpressionTransforms.LdObjToLdLoc(inst, context);
// ldobj(...(addressof(ldloc V)) where ... can be zero or more ldflda instructions
// =>
// ldobj(...(ldloca V))
var temp = inst.Target;
var range = temp.ILRanges;
while (temp.MatchLdFlda(out var ldfldaTarget, out _)) {
temp = ldfldaTarget;
range = range.Concat(temp.ILRanges);
}
if (temp.MatchAddressOf(out var addressOfTarget) && addressOfTarget.MatchLdLoc(out var v)) {
var replacement = new LdLoca(v).WithILRange(addressOfTarget);
foreach (var r in range) {
replacement = replacement.WithILRange(r);
}
temp.ReplaceWith(replacement);
}
}
protected internal override void VisitStObj(StObj inst)

Loading…
Cancel
Save