Пример #1
0
 public void OnMethodCall(MethodFacts callerFacts, MethodBase callee, int ilIndex)
 {
     if (_unrollFlag)
         callerFacts.UnrollHeaders.Add(ilIndex);
     else
         callerFacts.NonUnrollHeaders.Add(ilIndex);
 }
Пример #2
0
 public void OnMethodCall(MethodFacts callerFacts, MethodBase callee, int ilIndex)
 {
     if (_unrollFlag)
     {
         callerFacts.UnrollHeaders.Add(ilIndex);
     }
     else
     {
         callerFacts.NonUnrollHeaders.Add(ilIndex);
     }
 }
Пример #3
0
        /// <summary>
        /// Adds a new method to the universe, identified by CallSite
        /// </summary>
        /// <param name="callSite">a CallSite instance</param>
        private void AddMethod(CallSite callSite)
        {
            Contract.Requires <ArgumentNullException>(callSite != null);

            var attrs = callSite.Callee.GetCustomAndInjectedAttributes <IOnMethodCall>();

            if (attrs.Length > 0)
            {
                MethodFacts callerFacts = GetFacts(callSite.Caller);
                foreach (var attr in attrs)
                {
                    attr.OnMethodCall(callerFacts, callSite.Callee, callSite.ILIndex);
                }
            }
            AddMethod(callSite.Callee);
        }
Пример #4
0
        private void PostProcess()
        {
            Queue <MethodFacts> q = new Queue <MethodFacts>();

            foreach (MethodFacts mf in _knownMethods.Values)
            {
                foreach (ElementMutation mut in mf.Mutations)
                {
                    foreach (ElementSource term in mut.GetMutatedTerminals())
                    {
                        if (term is IMutableSource)
                        {
                            ((IMutableSource)term).IndicateMutated();
                        }
                    }
                    foreach (ElementSource term in mut.GetSubMutatedTerminals())
                    {
                        if (term is IMutableSource)
                        {
                            ((IMutableSource)term).IndicateSubMutated();
                        }
                    }
                }
                if (mf.IsMutator || mf.IsUnsafe)
                {
                    q.Enqueue(mf);
                }
            }
            while (q.Count > 0)
            {
                MethodFacts mf = q.Dequeue();
                foreach (MethodBase c in mf.CallingMethods)
                {
                    MethodFacts mfc = _knownMethods[c];
                    if (!mfc.IsIndirectMutator)
                    {
                        mfc.IsIndirectMutator = true;
                        q.Enqueue(mfc);
                    }
                }
            }
        }
Пример #5
0
 private static void OrderDFS(MethodFacts mf, ref int nextIndex)
 {
     if (mf.InDFS)
     {
         mf.CallOrder = int.MaxValue;
         mf.IsRecursive = true;
         return;
     }
     mf.InDFS = true;
     foreach (var callee in mf.CallingMethods.Select(m => FactUniverse.Instance.GetFacts(m)))
     {
         OrderDFS(callee, ref nextIndex);
     }
     mf.InDFS = false;
     if (!mf.Visited)
     {
         mf.CallOrder = nextIndex++;
         mf.Visited = true;
     }
 }
Пример #6
0
 private static void OrderDFS(MethodFacts mf, ref int nextIndex)
 {
     if (mf.InDFS)
     {
         mf.CallOrder   = int.MaxValue;
         mf.IsRecursive = true;
         return;
     }
     mf.InDFS = true;
     foreach (var callee in mf.CallingMethods.Select(m => FactUniverse.Instance.GetFacts(m)))
     {
         OrderDFS(callee, ref nextIndex);
     }
     mf.InDFS = false;
     if (!mf.Visited)
     {
         mf.CallOrder = nextIndex++;
         mf.Visited   = true;
     }
 }
Пример #7
0
        private void OnNewMethod(MethodFacts mfacts)
        {
            mfacts.OnNewMethodCalled = true;
            MethodBase method = mfacts.Method;

            AddType(method.DeclaringType);
            IOnMethodDiscovery disc = (IOnMethodDiscovery)method.GetCustomOrInjectedAttribute(typeof(IOnMethodDiscovery));

            if (disc != null)
            {
                disc.OnDiscovery(method, EMethodDiscoveryStage.Processing);
            }
            RealizationsOf(method).AutoDo(AddMethod);
            if (mfacts.IsDecompilable)
            {
                mfacts.INVA.CalledMethods.AutoDo(AddMethod);
                mfacts.INVA.ConstructedObjects.AutoDo(AddConstructor);
                mfacts.INVA.ReferencedTypes.AutoDo(AddType);
                mfacts.INVA.ReadFields.AutoDo(OnFieldSeen);
                mfacts.INVA.WrittenFields.AutoDo(OnFieldSeen);
                mfacts.INVA.ReferencedFields.AutoDo(OnFieldSeen);
                mfacts.INVA.ElementSources
                .Where(src => src is AllocationSite)
                .Select(src => (AllocationSite)src)
                .AutoDo(src => _allocSites.Add(src));
                mfacts.INVA.Run();
                if (method is MethodInfo)
                {
                    mfacts.Realizations = RealizationsOf((MethodInfo)method).ToBufferedEnumerable();
                }
                else
                {
                    mfacts.Realizations = Enumerable.Repeat(method, 1);
                }
            }
        }
Пример #8
0
 private void OnNewMethod(MethodFacts mfacts)
 {
     mfacts.OnNewMethodCalled = true;
     MethodBase method = mfacts.Method;
     AddType(method.DeclaringType);
     IOnMethodDiscovery disc = (IOnMethodDiscovery)method.GetCustomOrInjectedAttribute(typeof(IOnMethodDiscovery));
     if (disc != null)
         disc.OnDiscovery(method, EMethodDiscoveryStage.Processing);
     RealizationsOf(method).AutoDo(AddMethod);
     if (mfacts.IsDecompilable)
     {
         mfacts.INVA.CalledMethods.AutoDo(AddMethod);
         mfacts.INVA.ConstructedObjects.AutoDo(AddConstructor);
         mfacts.INVA.ReferencedTypes.AutoDo(AddType);
         mfacts.INVA.ReadFields.AutoDo(OnFieldSeen);
         mfacts.INVA.WrittenFields.AutoDo(OnFieldSeen);
         mfacts.INVA.ReferencedFields.AutoDo(OnFieldSeen);
         mfacts.INVA.ElementSources
             .Where(src => src is AllocationSite)
             .Select(src => (AllocationSite)src)
             .AutoDo(src => _allocSites.Add(src));
         mfacts.INVA.Run();
         if (method is MethodInfo)
             mfacts.Realizations = RealizationsOf((MethodInfo)method).ToBufferedEnumerable();
         else
             mfacts.Realizations = Enumerable.Repeat(method, 1);
     }
 }