コード例 #1
0
ファイル: Graph.cs プロジェクト: sysprogs/CCI
        /// <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);
                    }
                }
            }
        }
コード例 #2
0
ファイル: HandlerInferencer.cs プロジェクト: sysprogs/CCI
        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;
            }
        }