/// <summary> /// Given an instruction representing an address (byref), find the local or parameter it corresponds to or null /// </summary> public object LocalOrParameter(Analysis.Instruction address) { if (address == null) { return(null); } while (true) { if (address.IsMergeNode) { address = address.Operand1; } // all merges should be same address else { switch (address.Operation.OperationCode) { case OperationCode.Ldarg: case OperationCode.Ldarg_0: case OperationCode.Ldarg_1: case OperationCode.Ldarg_2: case OperationCode.Ldarg_3: case OperationCode.Ldarg_S: case OperationCode.Ldarga: case OperationCode.Ldarga_S: return(address.Operation.Value); // the parameter definition case OperationCode.Ldloca: case OperationCode.Ldloca_S: return(address.Operation.Value); // the local definition default: return(null); } } } }
private static void UpdateLocation(ref FMap <ILocalDefinition, Analysis.Instruction> currentLocals, ref FMap <IParameterDefinition, Analysis.Instruction> currentParameters, object localOrParameter, Analysis.Instruction newValue) { Contract.Requires(currentParameters != null); Contract.Requires(currentLocals != null); Contract.Ensures(Contract.ValueAtReturn(out currentParameters) != null); Contract.Ensures(Contract.ValueAtReturn(out currentLocals) != null); var local = localOrParameter as ILocalDefinition; if (local != null) { currentLocals = currentLocals.Insert(local, newValue); return; } var param = localOrParameter as IParameterDefinition; if (param != null) { currentParameters = currentParameters.Insert(param, newValue); return; } }