Browse Source

Handle cpobj instruction as stobj(ldobj).

pull/170/merge
Daniel Grunwald 14 years ago
parent
commit
4ec92d9a55
  1. 15
      ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs
  2. 4
      ICSharpCode.Decompiler/ILAst/PeepholeTransform.cs

15
ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -485,9 +485,12 @@ namespace ICSharpCode.Decompiler.Ast @@ -485,9 +485,12 @@ namespace ICSharpCode.Decompiler.Ast
return arg1;
else
return arg1.CastTo(operandAsTypeRef);
case ILCode.Isinst: return arg1.CastAs(operandAsTypeRef);
case ILCode.Box: return arg1;
case ILCode.Unbox: return InlineAssembly(byteCode, args);
case ILCode.Isinst:
return arg1.CastAs(operandAsTypeRef);
case ILCode.Box:
return arg1;
case ILCode.Unbox:
return MakeRef(arg1.CastTo(operandAsTypeRef));
#endregion
#region Indirect
case ILCode.Ldind_Ref:
@ -539,11 +542,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -539,11 +542,7 @@ namespace ICSharpCode.Decompiler.Ast
case ILCode.Endfilter: return InlineAssembly(byteCode, args);
case ILCode.Endfinally: return null;
case ILCode.Initblk: return InlineAssembly(byteCode, args);
case ILCode.Initobj:
if (args[0] is DirectionExpression)
return new AssignmentExpression(((DirectionExpression)args[0]).Expression.Detach(), MakeDefaultValue((TypeReference)operand));
else
return InlineAssembly(byteCode, args);
case ILCode.Initobj: return InlineAssembly(byteCode, args);
case ILCode.DefaultValue:
return MakeDefaultValue((TypeReference)operand);
case ILCode.Jmp: return InlineAssembly(byteCode, args);

4
ICSharpCode.Decompiler/ILAst/PeepholeTransform.cs

@ -90,6 +90,10 @@ namespace ICSharpCode.Decompiler.ILAst @@ -90,6 +90,10 @@ namespace ICSharpCode.Decompiler.ILAst
expr.Code = ILCode.Stobj;
expr.Arguments.Add(new ILExpression(ILCode.DefaultValue, expr.Operand));
modified = true;
} else if (expr.Code == ILCode.Cpobj) {
expr.Code = ILCode.Stobj;
expr.Arguments[1] = new ILExpression(ILCode.Ldobj, expr.Operand, expr.Arguments[1]);
modified = true;
}
ILExpression arg, arg2;
TypeReference type;

Loading…
Cancel
Save