private static DictionaryAnalysisData <AnalysisEntity, PerEntityPredicatedAnalysisData> MergeForPredicatedDataInBothBranches( DictionaryAnalysisData <AnalysisEntity, PerEntityPredicatedAnalysisData> predicatedData1, DictionaryAnalysisData <AnalysisEntity, PerEntityPredicatedAnalysisData> predicatedData2, DictionaryAnalysisData <TKey, TValue> coreAnalysisData1, DictionaryAnalysisData <TKey, TValue> coreAnalysisData2, MapAbstractDomain <TKey, TValue> coreDataAnalysisDomain, Action <DictionaryAnalysisData <TKey, TValue>, DictionaryAnalysisData <TKey, TValue> > applyPredicatedData) { Debug.Assert(predicatedData1 != null); Debug.Assert(predicatedData2 != null); Debug.Assert(coreAnalysisData1 != null); Debug.Assert(coreAnalysisData2 != null); var result = new DictionaryAnalysisData <AnalysisEntity, PerEntityPredicatedAnalysisData>(); foreach (var kvp in predicatedData1) { DictionaryAnalysisData <TKey, TValue> resultTruePredicatedData; DictionaryAnalysisData <TKey, TValue> resultFalsePredicatedData; if (!predicatedData2.TryGetValue(kvp.Key, out var value2)) { // Data predicated by the analysis entity present in only one branch. // We should merge with the core non-predicate data in other branch. resultTruePredicatedData = MergeForPredicatedDataInOneBranch(kvp.Value.TruePredicatedData, coreAnalysisData2, coreDataAnalysisDomain); resultFalsePredicatedData = MergeForPredicatedDataInOneBranch(kvp.Value.FalsePredicatedData, coreAnalysisData2, coreDataAnalysisDomain); } else { // Data predicated by the analysis entity present in both branches. resultTruePredicatedData = Merge(kvp.Value.TruePredicatedData, value2.TruePredicatedData, coreAnalysisData1, coreAnalysisData2, coreDataAnalysisDomain, applyPredicatedData); resultFalsePredicatedData = Merge(kvp.Value.FalsePredicatedData, value2.FalsePredicatedData, coreAnalysisData1, coreAnalysisData2, coreDataAnalysisDomain, applyPredicatedData); } var perEntityPredicatedData = new PerEntityPredicatedAnalysisData(resultTruePredicatedData, resultFalsePredicatedData); result.Add(kvp.Key, perEntityPredicatedData); } foreach (var kvp in predicatedData2) { if (!predicatedData1.TryGetValue(kvp.Key, out var value2)) { // Data predicated by the analysis entity present in only one branch. // We should merge with the core non-predicate data in other branch. var resultTruePredicatedData = MergeForPredicatedDataInOneBranch(kvp.Value.TruePredicatedData, coreAnalysisData1, coreDataAnalysisDomain); var resultFalsePredicatedData = MergeForPredicatedDataInOneBranch(kvp.Value.FalsePredicatedData, coreAnalysisData1, coreDataAnalysisDomain); var perEntityPredicatedData = new PerEntityPredicatedAnalysisData(resultTruePredicatedData, resultFalsePredicatedData); result.Add(kvp.Key, perEntityPredicatedData); } } return(result); }
protected void StartTrackingPredicatedData(AnalysisEntity predicatedEntity, DictionaryAnalysisData <TKey, TValue> truePredicatedData, DictionaryAnalysisData <TKey, TValue> falsePredicatedData) { Debug.Assert(predicatedEntity.IsCandidatePredicateEntity()); Debug.Assert(predicatedEntity.CaptureIdOpt != null, "Currently we only support predicated data tracking for flow captures"); AssertValidAnalysisData(); EnsurePredicatedData(); _lazyPredicateDataMap[predicatedEntity] = new PerEntityPredicatedAnalysisData(truePredicatedData, falsePredicatedData); AssertValidAnalysisData(); }
public void TransferPredicatedData(AnalysisEntity fromEntity, AnalysisEntity toEntity) { Debug.Assert(HasPredicatedDataForEntity(fromEntity)); Debug.Assert(fromEntity.CaptureIdOpt != null, "Currently we only support predicated data tracking for flow captures"); Debug.Assert(toEntity.CaptureIdOpt != null, "Currently we only support predicated data tracking for flow captures"); AssertValidAnalysisData(); if (_lazyPredicateDataMap.TryGetValue(fromEntity, out var fromEntityPredicatedData)) { _lazyPredicateDataMap[toEntity] = new PerEntityPredicatedAnalysisData(fromEntityPredicatedData); } AssertValidAnalysisData(); }
protected void StartTrackingPredicatedData(AnalysisEntity predicatedEntity, DictionaryAnalysisData <TKey, TValue> truePredicatedData, DictionaryAnalysisData <TKey, TValue> falsePredicatedData) { Debug.Assert(predicatedEntity.Type.SpecialType == SpecialType.System_Boolean || predicatedEntity.Type.IsNullableOfBoolean() || predicatedEntity.Type.Language == LanguageNames.VisualBasic && predicatedEntity.Type.SpecialType == SpecialType.System_Object); Debug.Assert(predicatedEntity.CaptureIdOpt != null, "Currently we only support predicated data tracking for flow captures"); AssertValidAnalysisData(); EnsurePredicatedData(); _lazyPredicateDataMap[predicatedEntity] = new PerEntityPredicatedAnalysisData(truePredicatedData, falsePredicatedData); AssertValidAnalysisData(); }
private static DictionaryAnalysisData <AnalysisEntity, PerEntityPredicatedAnalysisData> MergeForPredicatedDataInOneBranch( DictionaryAnalysisData <AnalysisEntity, PerEntityPredicatedAnalysisData> predicatedData, DictionaryAnalysisData <TKey, TValue> coreAnalysisDataForOtherBranch, MapAbstractDomain <TKey, TValue> coreDataAnalysisDomain) { Debug.Assert(predicatedData != null); Debug.Assert(coreAnalysisDataForOtherBranch != null); var result = new DictionaryAnalysisData <AnalysisEntity, PerEntityPredicatedAnalysisData>(); foreach (var kvp in predicatedData) { var resultTruePredicatedData = MergeForPredicatedDataInOneBranch(kvp.Value.TruePredicatedData, coreAnalysisDataForOtherBranch, coreDataAnalysisDomain); var resultFalsePredicatedData = MergeForPredicatedDataInOneBranch(kvp.Value.FalsePredicatedData, coreAnalysisDataForOtherBranch, coreDataAnalysisDomain); var perEntityPredicatedData = new PerEntityPredicatedAnalysisData(resultTruePredicatedData, resultFalsePredicatedData); result.Add(kvp.Key, perEntityPredicatedData); } return(result); }
public PerEntityPredicatedAnalysisData(PerEntityPredicatedAnalysisData fromData) : this(fromData.TruePredicatedData, fromData.FalsePredicatedData) { }