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; }