Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
 protected override void ResetValueTypeInstanceAnalysisData(IOperation operation)
 {
     if (AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity analysisEntity))
     {
         ResetValueTypeInstanceAnalysisData(analysisEntity);
     }
 }
Esempio n. 3
0
 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);
        }
Esempio n. 5
0
 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);
     }
 }
Esempio n. 6
0
        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);
            }
        }