public override void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
     if (Process(specializedMethodDefinition))
     {
         visitor.Visit(specializedMethodDefinition);
     }
     base.Visit(specializedMethodDefinition);
 }
Exemplo n.º 2
0
        /// <summary>
        /// A specialized method definition or generic method instance does not have a body. Given a method definition,
        /// find the unspecialized version of the definition and fetch the body.
        /// </summary>
        /// <param name="methodDefinition"></param>
        /// <returns></returns>
        internal static IMethodBody GetMethodBodyFromUnspecializedVersion(IMethodDefinition methodDefinition)
        {
            IGenericMethodInstance genericMethodInstance = methodDefinition as IGenericMethodInstance;

            if (genericMethodInstance != null)
            {
                return(GetMethodBodyFromUnspecializedVersion(genericMethodInstance.GenericMethod.ResolvedMethod));
            }
            ISpecializedMethodDefinition specializedMethodDefinition = methodDefinition as ISpecializedMethodDefinition;

            if (specializedMethodDefinition != null)
            {
                return(GetMethodBodyFromUnspecializedVersion(specializedMethodDefinition.UnspecializedVersion.ResolvedMethod));
            }
            return(methodDefinition.Body);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Get the unspecialized method definition is <paramref name="methodDefinition"/> is a specialized
        /// version, or itself otherwise.
        /// </summary>
        /// <param name="methodDefinition"></param>
        /// <returns></returns>
        internal static IMethodDefinition UnspecializedMethodDefinition(IMethodDefinition methodDefinition)
        {
            IGenericMethodInstance genericMethodInstance = methodDefinition as IGenericMethodInstance;

            if (genericMethodInstance != null)
            {
                methodDefinition = genericMethodInstance.GenericMethod.ResolvedMethod;
            }
            ISpecializedMethodDefinition specializedMethodDefinition = methodDefinition as ISpecializedMethodDefinition;

            if (specializedMethodDefinition != null)
            {
                return(specializedMethodDefinition.UnspecializedVersion);
            }
            return(methodDefinition);
        }
Exemplo n.º 4
0
        private static IMethodBody /*?*/ FirstStatementIsIteratorCreation(IMetadataHost host, ISourceMethodBody possibleIterator, INameTable nameTable, IStatement statement)
        {
            ICreateObjectInstance createObjectInstance = GetICreateObjectInstance(statement);

            if (createObjectInstance == null)
            {
                // If the first statement in the method body is not the creation of iterator closure, return a dummy.
                // Possible corner case not handled: a local is used to hold the constant value for the initial state of the closure.
                return(null);
            }
            ITypeReference closureType /*?*/        = createObjectInstance.MethodToCall.ContainingType;
            ITypeReference unspecializedClosureType = ContractHelper.Unspecialized(closureType);

            if (!AttributeHelper.Contains(unspecializedClosureType.Attributes, host.PlatformType.SystemRuntimeCompilerServicesCompilerGeneratedAttribute))
            {
                return(null);
            }
            INestedTypeReference closureTypeAsNestedTypeReference = unspecializedClosureType as INestedTypeReference;

            if (closureTypeAsNestedTypeReference == null)
            {
                return(null);
            }
            ITypeReference unspecializedClosureContainingType = ContractHelper.Unspecialized(closureTypeAsNestedTypeReference.ContainingType);

            if (closureType != null && TypeHelper.TypesAreEquivalent(possibleIterator.MethodDefinition.ContainingTypeDefinition, unspecializedClosureContainingType))
            {
                IName MoveNextName = nameTable.GetNameFor("MoveNext");
                foreach (ITypeDefinitionMember member in closureType.ResolvedType.GetMembersNamed(MoveNextName, false))
                {
                    IMethodDefinition moveNext = member as IMethodDefinition;
                    if (moveNext != null)
                    {
                        ISpecializedMethodDefinition moveNextGeneric = moveNext as ISpecializedMethodDefinition;
                        if (moveNextGeneric != null)
                        {
                            moveNext = moveNextGeneric.UnspecializedVersion.ResolvedMethod;
                        }
                        return(moveNext.Body);
                    }
                }
            }
            return(null);
        }
Exemplo n.º 5
0
 public virtual void onMetadataElement(ISpecializedMethodDefinition specializedMethodDefinition) { }
Exemplo n.º 6
0
 /// <summary>
 /// Performs some computation with the given specialized method definition.
 /// </summary>
 public void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
     this.Visit((IMethodDefinition)specializedMethodDefinition);
 }
Exemplo n.º 7
0
 public void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
     //references are dispatched in such a way that they never get here.
     //thus, assume that we are traversing a generic type instance.
     this.traverser.Traverse((IMethodDefinition)specializedMethodDefinition);
 }
Exemplo n.º 8
0
 /// <summary>
 /// Performs some computation with the given specialized method definition.
 /// </summary>
 public virtual void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
 }
Exemplo n.º 9
0
 public void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 10
0
 public virtual void onMetadataElement(ISpecializedMethodDefinition specializedMethodDefinition)
 {
 }
 /// <summary>
 /// Performs some computation with the given specialized method definition.
 /// </summary>
 public virtual void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
 }
Exemplo n.º 12
0
        public static ITypeMemberReference CanonicalizeMemberReference(ITypeMemberReference member)
        {
            if (null == member)
            {
                return(null);
            }

            if (member == null || member == Dummy.Method)
            {
                throw new Exception("Can't resolve member");
            }

            // function pointers don't have declaring types and they don't
            // really fit our model, so we ignore them.
            if (null == member.ContainingType)
            {
                return(null);
            }

            //
            // first canonicalize the method...
            //
            IGenericMethodInstanceReference genMeth = member as IGenericMethodInstanceReference;

            if ((genMeth != null))
            {
                member = genMeth.GenericMethod;
            }

            ISpecializedMethodReference    specializedMethodRef   = member as ISpecializedMethodReference;
            ISpecializedFieldReference     specializedFieldRef    = member as ISpecializedFieldReference;
            ISpecializedPropertyDefinition specializedPropertyDef = member as ISpecializedPropertyDefinition;
            ISpecializedEventDefinition    specializedEventDef    = member as ISpecializedEventDefinition;
            ISpecializedMethodDefinition   specializedMethodDef   = member as ISpecializedMethodDefinition;
            ISpecializedFieldDefinition    specializedFieldDef    = member as ISpecializedFieldDefinition;

            if (specializedMethodRef != null)
            {
                member = specializedMethodRef.UnspecializedVersion;
            }
            else if (specializedFieldRef != null)
            {
                member = specializedFieldRef.UnspecializedVersion;
            }
            else if (specializedPropertyDef != null)
            {
                member = specializedPropertyDef.UnspecializedVersion;
            }
            else if (specializedEventDef != null)
            {
                member = specializedEventDef.UnspecializedVersion;
            }
            else if (specializedMethodDef != null)
            {
                member = specializedMethodDef.UnspecializedVersion;
            }
            else if (specializedFieldDef != null)
            {
                member = specializedFieldDef.UnspecializedVersion;
            }

            if (member == null)
            {
                throw new Exception("Can't canonicalize some member.");
            }
            return(member);
        }
Exemplo n.º 13
0
 public override void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
     allElements.Add(new InvokInfo(Traverser, "ISpecializedMethodDefinition", specializedMethodDefinition));
 }
 public override void Visit(ISpecializedMethodDefinition specializedMethodDefinition)
 {
     if(Process(specializedMethodDefinition)){visitor.Visit(specializedMethodDefinition);}
     base.Visit(specializedMethodDefinition);
 }