예제 #1
0
        protected IOperation GetOperationInstance(IOperation operation)
        {
            if (operation != null)
            {
                switch (operation.Kind.ConvertToLocalType())
                {
                case ConvertedOperationKind.FieldAccess:
                    IFieldAccess fieldAccess = operation as IFieldAccess;
                    if (fieldAccess != null)
                    {
                        return(fieldAccess.Instance);
                    }
                    break;

                case ConvertedOperationKind.InvocationExpression:
                    IInvocationExpression invocationExpression = operation as IInvocationExpression;
                    if (invocationExpression != null)
                    {
                        return(invocationExpression.Instance);
                    }
                    break;
                }
            }
            return(null);
        }
예제 #2
0
            private void UpdateStateCopy(ConstantPropagationDomain state, IFieldAccess dest, IVariable src)
            {
                /*
                 * When we set a field of an object O to a constant, we also need to set the same field
                 * to objects that are must aliased to O. We know that all field accesses corresponding
                 * to closure fields must alias each other since they are compiler generated. That is,
                 * a user cannot instantiate such class nor does the compiler instantiate it inside the class itself.
                 */

                var faccess           = GetAccessRef(dest);
                IFieldDefinition fdef = faccess.Item2.Resolve(parent.Host);

                // We know that closure field accesses must alias each other.
                if (IsClosureField(fdef))
                {
                    foreach (var pair in parent.Fields)
                    {
                        var fresolved = pair.Item2.Resolve(parent.Host);

                        if (fresolved == fdef || fresolved.Equals(fdef))
                        {
                            state.Set(GetAccess(pair.Item1), state.Constants(src).Clone());
                        }
                    }
                }
                else
                {
                    // TODO: refine this by type of the field.
                    state.SetFieldNonConstant();
                }
            }
예제 #3
0
 private Tuple <IFieldAccess, IFieldReference> GetAccessRef(IFieldAccess f)
 {
     foreach (var pair in parent.Fields)
     {
         if (f.ToExpression().ToString() == pair.Item1.ToExpression().ToString())
         {
             return(pair);
         }
     }
     return(null);
 }
예제 #4
0
 /// <summary>
 /// Same field accesses can have different objects associated.
 /// This function gets that object that is used in "state."
 /// </summary>
 /// <param name="f"></param>
 /// <returns></returns>
 private IFieldAccess GetAccess(IFieldAccess f)
 {
     foreach (var pair in parent.Fields)
     {
         if (f.ToExpression().ToString() == pair.Item1.ToExpression().ToString())
         {
             return(pair.Item1);
         }
     }
     return(null);
 }
예제 #5
0
            public bool Escaped(Instruction instruction, IFieldAccess field)
            {
                if (!analysis.PossiblyRow(field.Type))
                {
                    return(true);
                }

                var domain = info[instruction];

                if (domain.IsTop)
                {
                    return(true);
                }
                return(domain.Escaped(field));
            }
예제 #6
0
            /// <summary>
            /// Check whether a field access corresponds to a field we track.
            /// </summary>
            /// <param name="field"></param>
            /// <returns></returns>
            private bool IsFieldTracked(IFieldAccess field)
            {
                if (parent.TrackedFields.Contains(field))
                {
                    return(true);
                }

                // for sanity
                foreach (var f in parent.TrackedFields)
                {
                    if (f.ToExpression().ToString() == field.ToExpression().ToString())
                    {
                        return(true);
                    }
                }

                return(false);
            }
예제 #7
0
            public IEnumerable <Constant> GetConstants(Instruction instruction, IFieldAccess field)
            {
                if (!ConstantPropagationSetAnalysis.IsConstantType(field.Type, host))
                {
                    return(null);
                }

                var domain      = info[instruction];
                var fieldDomain = domain.Constants(field);

                if (fieldDomain.IsTop)
                {
                    return(null);
                }
                if (fieldDomain.IsBottom)
                {
                    return(new HashSet <Constant>());
                }

                return(new HashSet <Constant>(fieldDomain.Elements));
            }
예제 #8
0
 public ConstantSetDomain Constants(IFieldAccess f)
 {
     return(fieldMapping[f]);
 }
예제 #9
0
 public bool Contains(IFieldAccess f, ConstantSetDomain cpd)
 {
     return(fieldMapping[f].Contains(cpd));
 }
예제 #10
0
 public bool Contains(IFieldAccess f, Constant c)
 {
     return(fieldMapping[f].Contains(c));
 }
예제 #11
0
 public bool Contains(IFieldAccess f)
 {
     return(fieldMapping.ContainsKey(f));
 }
예제 #12
0
 public void Return(IFieldAccess f)
 {
     fset.Return(f);
 }
예제 #13
0
 private void UpdateStateNotConstant(ConstantPropagationDomain state, IFieldAccess f)
 {
     state.SetNonConstant(GetAccess(f));
 }
예제 #14
0
 public bool Escaped(IFieldAccess f)
 {
     return(fset.Escaped(f));
 }
예제 #15
0
 public void Set(IFieldAccess f, ConstantSetDomain cons)
 {
     fieldMapping[f] = cons;
 }
예제 #16
0
            private void UpdateStateCopy(ConstantPropagationDomain state, IVariable dest, IFieldAccess src)
            {
                var cl = state.Constants(GetAccess(src)).Clone();

                state.Set(dest, cl);
            }
예제 #17
0
 public void SetNonConstant(IFieldAccess f)
 {
     Constants(f).SetNotConstant();
 }
예제 #18
0
 public void Escape(IFieldAccess f)
 {
     fset.Escape(f);
 }