From b2ac8118753d4121dc17792593c5f560b1626453 Mon Sep 17 00:00:00 2001 From: de4dot Date: Sun, 23 Oct 2011 20:12:10 +0200 Subject: [PATCH] ParameterDefinition.Index is 1-based or 0-based --- AssemblyData/methodsrewriter/CodeGenerator.cs | 2 + blocks/cflow/InstructionEmulator.cs | 37 +++++++++++++------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/AssemblyData/methodsrewriter/CodeGenerator.cs b/AssemblyData/methodsrewriter/CodeGenerator.cs index c1076b11..d3039a84 100644 --- a/AssemblyData/methodsrewriter/CodeGenerator.cs +++ b/AssemblyData/methodsrewriter/CodeGenerator.cs @@ -257,6 +257,8 @@ namespace AssemblyData.methodsrewriter { } int getArgIndex(ParameterDefinition arg) { + if (ResolverUtils.hasThis(methodInfo.methodBase)) + return arg.Index + 1; return arg.Index; } diff --git a/blocks/cflow/InstructionEmulator.cs b/blocks/cflow/InstructionEmulator.cs index feca660d..7894bf49 100644 --- a/blocks/cflow/InstructionEmulator.cs +++ b/blocks/cflow/InstructionEmulator.cs @@ -29,6 +29,7 @@ namespace de4dot.blocks.cflow { IList variableDefinitions; List args = new List(); List locals = new List(); + int argBase; public void init(bool hasThis, bool initLocals, IList parameterDefinitions, IList variableDefinitions) { this.parameterDefinitions = parameterDefinitions; @@ -36,8 +37,11 @@ namespace de4dot.blocks.cflow { valueStack.init(); args.Clear(); - if (hasThis) + argBase = 0; + if (hasThis) { + argBase = 1; args.Add(new UnknownValue()); + } foreach (var arg in parameterDefinitions) args.Add(getUnknownValue(arg.ParameterType)); @@ -154,19 +158,28 @@ namespace de4dot.blocks.cflow { return getValue(args, i); } + int index(ParameterDefinition arg) { + return arg.Index + argBase; + } + public Value getArg(ParameterDefinition arg) { - return getArg(arg.Index); + return getArg(index(arg)); + } + + TypeReference getArgType(int index) { + index -= argBase; + if (0 <= index && index < parameterDefinitions.Count) + return parameterDefinitions[index].ParameterType; + return null; } void setArg(int index, Value value) { if (0 <= index && index < args.Count) - args[index] = truncateValue(value, parameterDefinitions[index].ParameterType); + args[index] = truncateValue(value, getArgType(index)); } Value getUnknownArg(int index) { - if (0 <= index && index < parameterDefinitions.Count) - return getUnknownValue(parameterDefinitions[index].ParameterType); - return new UnknownValue(); + return getUnknownValue(getArgType(index)); } public Value getLocal(int i) { @@ -200,7 +213,7 @@ namespace de4dot.blocks.cflow { public void emulate(Instruction instr) { switch (instr.OpCode.Code) { case Code.Starg: - case Code.Starg_S: emulate_Starg(((ParameterDefinition)instr.Operand).Index); break; + case Code.Starg_S: emulate_Starg((ParameterDefinition)instr.Operand); break; case Code.Stloc: case Code.Stloc_S: emulate_Stloc(((VariableDefinition)instr.Operand).Index); break; case Code.Stloc_0: emulate_Stloc(0); break; @@ -222,7 +235,7 @@ namespace de4dot.blocks.cflow { case Code.Ldloc_3: valueStack.push(getLocal(3)); break; case Code.Ldarga: - case Code.Ldarga_S: emulate_Ldarga(((ParameterDefinition)instr.Operand).Index); break; + case Code.Ldarga_S: emulate_Ldarga((ParameterDefinition)instr.Operand); break; case Code.Ldloca: case Code.Ldloca_S: emulate_Ldloca(((VariableDefinition)instr.Operand).Index); break; @@ -791,17 +804,17 @@ namespace de4dot.blocks.cflow { valueStack.pushUnknown(); } - void emulate_Starg(int index) { - setArg(index, valueStack.pop()); + void emulate_Starg(ParameterDefinition arg) { + setArg(index(arg), valueStack.pop()); } void emulate_Stloc(int index) { setLocal(index, valueStack.pop()); } - void emulate_Ldarga(int index) { + void emulate_Ldarga(ParameterDefinition arg) { valueStack.pushUnknown(); - setArg(index, getUnknownArg(index)); + setArg(index(arg), getUnknownArg(index(arg))); } void emulate_Ldloca(int index) {