public void OnMethodCall(MethodFacts callerFacts, MethodBase callee, int ilIndex) { if (_unrollFlag) callerFacts.UnrollHeaders.Add(ilIndex); else callerFacts.NonUnrollHeaders.Add(ilIndex); }
public void OnMethodCall(MethodFacts callerFacts, MethodBase callee, int ilIndex) { if (_unrollFlag) { callerFacts.UnrollHeaders.Add(ilIndex); } else { callerFacts.NonUnrollHeaders.Add(ilIndex); } }
/// <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); }
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); } } } }
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; } }
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); } } }
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); } }