public CoreValueContentAnalysisData MergeAnalysisDataForBackEdge(CoreValueContentAnalysisData forwardEdgeAnalysisData, CoreValueContentAnalysisData backEdgeAnalysisData)
            {
                Debug.Assert(forwardEdgeAnalysisData != null);
                Debug.Assert(backEdgeAnalysisData != null);

                // Stop tracking values present in both branches if their is an assignment to different literal values from the back edge.
                // Clone the input forwardEdgeAnalysisData to ensure we don't overwrite the input dictionary.
                using (forwardEdgeAnalysisData = new CoreValueContentAnalysisData(forwardEdgeAnalysisData))
                {
                    var keysInMap1 = forwardEdgeAnalysisData.Keys.ToList();
                    foreach (var key in keysInMap1)
                    {
                        var forwardEdgeValue = forwardEdgeAnalysisData[key];
                        if (backEdgeAnalysisData.TryGetValue(key, out var backEdgeValue) &&
                            backEdgeValue != forwardEdgeValue &&
                            backEdgeValue.NonLiteralState == forwardEdgeValue.NonLiteralState)
                        {
                            forwardEdgeAnalysisData[key] = ValueContentAbstractValue.MayBeContainsNonLiteralState;
                        }
                    }

                    var resultMap = Merge(forwardEdgeAnalysisData, backEdgeAnalysisData);
                    Debug.Assert(Compare(forwardEdgeAnalysisData, resultMap) <= 0);
                    Debug.Assert(Compare(backEdgeAnalysisData, resultMap) <= 0);
                    return(resultMap);
                }
            }
Esempio n. 2
0
 internal ValueContentAnalysisData(
     CoreValueContentAnalysisData mergedCoreAnalysisData,
     PredicatedAnalysisData <AnalysisEntity, ValueContentAbstractValue> predicatedData1,
     PredicatedAnalysisData <AnalysisEntity, ValueContentAbstractValue> predicatedData2,
     bool isReachableData,
     MapAbstractDomain <AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
     : base(mergedCoreAnalysisData, predicatedData1, predicatedData2, isReachableData, coreDataAnalysisDomain)
 {
 }