From 22494bde37fe77bfeaf4455018ca2983fc0c6b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Mon, 12 Nov 2007 14:23:40 +0000 Subject: [PATCH] Define local variables when value is first assigned to them --- src/AstMetodBodyBuilder.cs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/AstMetodBodyBuilder.cs b/src/AstMetodBodyBuilder.cs index 1faf0c2b1..fd652bb53 100644 --- a/src/AstMetodBodyBuilder.cs +++ b/src/AstMetodBodyBuilder.cs @@ -12,6 +12,9 @@ namespace Decompiler { public class AstMetodBodyBuilder { + static Dictionary localVarTypes = new Dictionary(); + static Dictionary localVarDefined = new Dictionary(); + public static BlockStatement CreateMetodBody(MethodDefinition methodDef) { Ast.BlockStatement astBlock = new Ast.BlockStatement(); @@ -23,10 +26,13 @@ namespace Decompiler exprCol.Optimize(); foreach(VariableDefinition varDef in methodDef.Body.Variables) { - Ast.VariableDeclaration astVar = new Ast.VariableDeclaration(varDef.Name); - Ast.LocalVariableDeclaration astLocalVar = new Ast.LocalVariableDeclaration(astVar); - astLocalVar.TypeReference = new Ast.TypeReference(varDef.VariableType.FullName); - astBlock.Children.Add(astLocalVar); + localVarTypes[varDef.Name] = varDef.VariableType; + localVarDefined[varDef.Name] = false; + +// Ast.VariableDeclaration astVar = new Ast.VariableDeclaration(varDef.Name); +// Ast.LocalVariableDeclaration astLocalVar = new Ast.LocalVariableDeclaration(astVar); +// astLocalVar.TypeReference = new Ast.TypeReference(varDef.VariableType.FullName); +// astBlock.Children.Add(astLocalVar); } for(int i = 0; i < exprCol.Count; i++) { @@ -301,7 +307,16 @@ namespace Decompiler case Code.Sizeof: throw new NotImplementedException(); case Code.Starg: throw new NotImplementedException(); case Code.Stfld: throw new NotImplementedException(); - case Code.Stloc: return new Ast.AssignmentExpression(new Ast.IdentifierExpression(((VariableDefinition)operand).Name), AssignmentOperatorType.Assign, arg1); + case Code.Stloc: + string name = ((VariableDefinition)operand).Name; + if (localVarDefined[name]) { + return new Ast.AssignmentExpression(new Ast.IdentifierExpression(name), AssignmentOperatorType.Assign, arg1); + } else { + Ast.LocalVariableDeclaration astLocalVar = new Ast.LocalVariableDeclaration(new Ast.VariableDeclaration(name, arg1)); + astLocalVar.TypeReference = new Ast.TypeReference(localVarTypes[name].FullName); + localVarDefined[name] = true; + return astLocalVar; + } case Code.Stobj: throw new NotImplementedException(); case Code.Stsfld: throw new NotImplementedException(); case Code.Switch: throw new NotImplementedException();