示例#1
0
        public void ProcessSummary(ReachabilitySummary summary, IMethodDefinition summarizedMethod)
        {
            Contract.Requires(GarbageCollectHelper.MethodDefinitionIsUnspecialized(summarizedMethod));

            foreach (IMethodDefinition nonvirtuallyCalledMethod in summary.NonvirtuallyCalledMethods)
            {
                NoteGenericParameterFlowForMethod(nonvirtuallyCalledMethod);

                IMethodDefinition unspecializedMethod = GarbageCollectHelper.UnspecializeAndResolveMethodReference(nonvirtuallyCalledMethod);

                analysisReasons.NoteNonVirtualDispatchReachableForReason(nonvirtuallyCalledMethod, analysisReasons.DispatchReachedBecauseContainingMethodWasReached(summarizedMethod));

                if (nonvirtualDispatches.Add(unspecializedMethod))
                {
                    MethodReachedReason reason = analysisReasons.MethodReachedByDispatchAgainstNonVirtualMethod(unspecializedMethod);

                    NotePotentialNonVirtualMethodReachedForReason(unspecializedMethod, reason);
                }
            }

            foreach (IMethodDefinition virtuallyCalledMethod in summary.VirtuallyCalledMethods)
            {
                NoteGenericParameterFlowForMethod(virtuallyCalledMethod);

                IMethodDefinition unspecializedMethod = GarbageCollectHelper.UnspecializeAndResolveMethodReference(virtuallyCalledMethod);

                analysisReasons.NoteVirtualDispatchReachableForReason(unspecializedMethod, analysisReasons.DispatchReachedBecauseContainingMethodWasReached(summarizedMethod));

                NoteVirtualDispatch(unspecializedMethod);
            }

            foreach (ITypeDefinition reachableType in summary.ReachableTypes)
            {
                TypeUseFound(GarbageCollectHelper.UnspecializeAndResolveTypeReference(reachableType));
            }

            foreach (ITypeDefinition constructedType in summary.ConstructedTypes)
            {
                ITypeDefinition unspecializedConstructedType = GarbageCollectHelper.UnspecializeAndResolveTypeReference(constructedType);

                ConstructionFoundWithReason(unspecializedConstructedType, analysisReasons.TypeConstructedBecauseAllocatingMethodReached(summarizedMethod));
            }

            foreach (IFieldDefinition reachableField in summary.ReachableFields)
            {
                fields.Add(GarbageCollectHelper.UnspecializeAndResolveFieldReference(reachableField));
            }

            foreach (IGenericParameter genericParameter in summary.ConstructedTypeParameters)
            {
                NoteTypeVariableConstructed(genericParameter);
            }

            unresolvedReferences.UnionWith(summary.UnresolvedReferences);
        }
    private void NotePotentialNonVirtualMethodReachedForReason(IMethodDefinition targetMethodDefinition, MethodReachedReason reason) {
      Contract.Requires(GarbageCollectHelper.MethodDefinitionIsUnspecialized(targetMethodDefinition));

      this.TypeUseFound(GarbageCollectHelper.UnspecializeAndResolveTypeReference(targetMethodDefinition.ContainingTypeDefinition));

      this.AddToWorklist(GarbageCollectHelper.UnspecializeAndResolveMethodReference(targetMethodDefinition));

      // Really should a precondition requiring reason to not be null,
      // but for now there are some situations where we still don't 
      // create reasons, so they pass null as a cop out.
      if (reason != null) {
        analysisReasons.NoteMethodReachableForReason(targetMethodDefinition, reason);
      }
      
    }
示例#3
0
        private void NotePotentialNonVirtualMethodReachedForReason(IMethodDefinition targetMethodDefinition, MethodReachedReason reason)
        {
            Contract.Requires(GarbageCollectHelper.MethodDefinitionIsUnspecialized(targetMethodDefinition));

            this.TypeUseFound(GarbageCollectHelper.UnspecializeAndResolveTypeReference(targetMethodDefinition.ContainingTypeDefinition));

            this.AddToWorklist(GarbageCollectHelper.UnspecializeAndResolveMethodReference(targetMethodDefinition));

            // Really should a precondition requiring reason to not be null,
            // but for now there are some situations where we still don't
            // create reasons, so they pass null as a cop out.
            if (reason != null)
            {
                analysisReasons.NoteMethodReachableForReason(targetMethodDefinition, reason);
            }
        }