From 970706161acbdce0ce7c31f935238a71fdde20f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sun, 11 Nov 2007 17:53:56 +0000 Subject: [PATCH] Get type of elements obtained from array --- src/AstMetodBodyBuilder.cs | 2 +- src/StackAnalysis.Types.cs | 8 +++++++- src/StackAnalysis.cs | 21 ++++++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/AstMetodBodyBuilder.cs b/src/AstMetodBodyBuilder.cs index d7f196548..134d3feb4 100644 --- a/src/AstMetodBodyBuilder.cs +++ b/src/AstMetodBodyBuilder.cs @@ -53,7 +53,7 @@ namespace Decompiler args); if (codeExpr is Ast.Expression) { if (Util.GetNumberOfOutputs(methodDef, instr) == 1) { - string type = stackAnalysis.StackAfter[instr].Peek(1).Type.FullName; + string type = stackAnalysis.GetTypeOf(instr).FullName; string name = string.Format("expr{0:X2}", instr.Offset); Ast.LocalVariableDeclaration astLocal = new Ast.LocalVariableDeclaration(new Ast.TypeReference(type.ToString())); astLocal.Variables.Add(new Ast.VariableDeclaration(name, (Ast.Expression)codeExpr)); diff --git a/src/StackAnalysis.Types.cs b/src/StackAnalysis.Types.cs index b7a398e0b..b2f62823d 100644 --- a/src/StackAnalysis.Types.cs +++ b/src/StackAnalysis.Types.cs @@ -12,6 +12,7 @@ namespace Decompiler { public partial class StackAnalysis { + static public Cecil.TypeReference TypeVoid = GetCecilType(typeof(void)); static public Cecil.TypeReference TypeObject = GetCecilType(typeof(Object)); static public Cecil.TypeReference TypeBool = GetCecilType(typeof(bool)); static public Cecil.TypeReference TypeInt32 = GetCecilType(typeof(Int32)); @@ -81,8 +82,13 @@ namespace Decompiler case Code.Ldelem_U2: case Code.Ldelem_U4: case Code.Ldelem_R4: - case Code.Ldelem_R8: + case Code.Ldelem_R8: throw new NotImplementedException(); case Code.Ldelem_Ref: + if (arg1 is ArrayType) { + return ((ArrayType)arg1).ElementType; + } else { + throw new NotImplementedException(); + } case Code.Ldelem_Any: case Code.Ldelema: throw new NotImplementedException(); diff --git a/src/StackAnalysis.cs b/src/StackAnalysis.cs index adc18e582..2656e5737 100644 --- a/src/StackAnalysis.cs +++ b/src/StackAnalysis.cs @@ -63,9 +63,11 @@ namespace Decompiler return new CilStack(this); } - public void PopCount(int count) + public CilStackSlot[] PopCount(int count) { + CilStackSlot[] poped = this.GetRange(this.Count - count, count).ToArray(); this.RemoveRange(this.Count - count, count); + return poped; } public void Push(CilStackSlot slot) @@ -115,6 +117,15 @@ namespace Decompiler get { return stackAfter; } } + public Cecil.TypeReference GetTypeOf(Instruction inst) + { + if (Util.GetNumberOfOutputs(methodDef, inst) == 0) { + return TypeVoid; + } else { + return StackAfter[inst].Peek(1).Type; + } + } + public StackAnalysis(MethodDefinition methodDef) { this.methodDef = methodDef; @@ -156,9 +167,13 @@ namespace Decompiler CilStack ChangeStack(CilStack oldStack, Instruction inst) { CilStack newStack = oldStack.Clone(); - newStack.PopCount(Util.GetNumberOfInputs(methodDef, inst)); + CilStackSlot[] popedSlots = newStack.PopCount(Util.GetNumberOfInputs(methodDef, inst)); + List typeArgs = new List(); + foreach(CilStackSlot slot in popedSlots) { + typeArgs.Add(slot.Type); + } for (int i = 0; i < Util.GetNumberOfOutputs(methodDef, inst); i++) { - newStack.Push(new CilStackSlot(inst, GetType(methodDef, inst))); + newStack.Push(new CilStackSlot(inst, GetType(methodDef, inst, typeArgs.ToArray()))); } return newStack; }