/// <summary> /// Transfers the analysis data rooted from <paramref name="assignedValueOperation"/> to <paramref name="targetAnalysisEntity"/>, for a value type assignment operation. /// This involves transfer of data for of all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/> as the valueAnalysisEntity for the <paramref name="assignedValueOperation"/> /// to all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/> as <paramref name="targetAnalysisEntity"/>. /// </summary> private void TransferValueTypeInstanceAnalysisDataForAssignment(AnalysisEntity targetAnalysisEntity, IOperation assignedValueOperation) { Debug.Assert(HasPointsToAnalysisResult); Debug.Assert(targetAnalysisEntity.Type.HasValueCopySemantics()); IEnumerable <AnalysisEntity> dependentAnalysisEntities; if (AnalysisEntityFactory.TryCreate(assignedValueOperation, out AnalysisEntity valueAnalysisEntity)) { dependentAnalysisEntities = GetChildAnalysisEntities(valueAnalysisEntity); } else { // For allocations. PointsToAbstractValue newValueLocation = GetPointsToAbstractValue(assignedValueOperation); if (newValueLocation.Kind == PointsToAbstractValueKind.NoLocation) { return; } dependentAnalysisEntities = GetChildAnalysisEntities(newValueLocation); } foreach (AnalysisEntity dependentInstance in dependentAnalysisEntities) { // Clone the dependent instance but with with target as the root. AnalysisEntity newAnalysisEntity = AnalysisEntityFactory.CreateWithNewInstanceRoot(dependentInstance, targetAnalysisEntity); var dependentValue = GetAbstractValue(dependentInstance); SetAbstractValue(newAnalysisEntity, dependentValue); } }
protected override void ResetValueTypeInstanceAnalysisData(IOperation operation) { if (AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity analysisEntity)) { ResetValueTypeInstanceAnalysisData(analysisEntity); } }
protected override void SetAbstractValueForAssignment(IOperation target, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue) { if (AnalysisEntityFactory.TryCreate(target, out AnalysisEntity targetAnalysisEntity)) { SetAbstractValueForAssignment(targetAnalysisEntity, assignedValueOperation, assignedValue); } }
protected override TAbstractAnalysisValue VisitAssignmentOperation(IAssignmentOperation operation, object argument) { var value = base.VisitAssignmentOperation(operation, argument); if (AnalysisEntityFactory.TryCreate(operation.Target, out AnalysisEntity targetEntity)) { value = GetAbstractValue(targetEntity); } return(value); }
protected sealed override TAbstractAnalysisValue ComputeAnalysisValueForOutArgument(IArgumentOperation operation, TAbstractAnalysisValue defaultValue) { if (AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity analysisEntity)) { var value = ComputeAnalysisValueForOutArgument(analysisEntity, operation, defaultValue); SetAbstractValue(analysisEntity, value); return(GetAbstractValue(analysisEntity)); } else { return(defaultValue); } }
protected override TAbstractAnalysisValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TAbstractAnalysisValue defaultValue) { if (AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity analysisEntity)) { if (!HasAbstractValue(analysisEntity)) { SetAbstractValue(analysisEntity, defaultValue); } return(GetAbstractValue(analysisEntity)); } else { return(defaultValue); } }