Пример #1
0
        public DataFlowAnalysisResult <TAnalysisResult, TAbstractAnalysisValue> ToResult <TAnalysisResult, TAbstractAnalysisValue>(
            Func <BasicBlock, DataFlowAnalysisInfo <TAnalysisData>, TAnalysisResult> getResult,
            ImmutableDictionary <IOperation, TAbstractAnalysisValue> stateMap,
            ImmutableDictionary <IOperation, PredicateValueKind> predicateValueKindMap,
            TAnalysisData mergedDataForUnhandledThrowOperations,
            ControlFlowGraph cfg,
            TAbstractAnalysisValue defaultUnknownValue)
            where TAnalysisResult : class
        {
            var resultBuilder = ImmutableDictionary.CreateBuilder <BasicBlock, TAnalysisResult>();

            foreach (var kvp in _info)
            {
                var block             = kvp.Key;
                var blockAnalysisData = kvp.Value;
                var result            = getResult(block, blockAnalysisData);
                resultBuilder.Add(block, result);
            }

            TAnalysisResult mergedStateForUnhandledThrowOperations = null;

            if (mergedDataForUnhandledThrowOperations != null)
            {
                var info = new DataFlowAnalysisInfo <TAnalysisData>(mergedDataForUnhandledThrowOperations, mergedDataForUnhandledThrowOperations);
                mergedStateForUnhandledThrowOperations = getResult(cfg.Exit, info);
            }

            return(new DataFlowAnalysisResult <TAnalysisResult, TAbstractAnalysisValue>(resultBuilder.ToImmutable(), stateMap,
                                                                                        predicateValueKindMap, mergedStateForUnhandledThrowOperations, cfg, defaultUnknownValue));
        }
 protected virtual TAnalysisData GetOutput(DataFlowAnalysisInfo <TAnalysisData> result) => result.Output;
 internal abstract TAnalysisResult ToResult(BasicBlock basicBlock, DataFlowAnalysisInfo <TAnalysisData> blockAnalysisData);
 protected override TAnalysisData GetOutput(DataFlowAnalysisInfo <TAnalysisData> result) => result.Input;
 internal void Update(BasicBlock block, DataFlowAnalysisInfo <TAnalysisData> newData)
 {
     _info[block] = newData;
 }