Esempio n. 1
0
        public override Vertex WriteVertex(NodeFactory factory)
        {
            Vertex containingType   = _containingTypeSig.WriteVertex(factory);
            Vertex methodSig        = _methodSig.WriteVertex(factory);
            Vertex methodNameAndSig = GetNativeWriter(factory).GetMethodNameAndSigSignature(_method.Name, methodSig);

            Debug.Assert(_instantiationArgsSig == null || (_method.HasInstantiation && _method.Instantiation.Length == _instantiationArgsSig.Length));

            Vertex[]    args  = null;
            MethodFlags flags = 0;

            if (_method.HasInstantiation)
            {
                flags |= MethodFlags.HasInstantiation;
                args   = new Vertex[_method.Instantiation.Length];
                for (int i = 0; i < args.Length; i++)
                {
                    args[i] = _instantiationArgsSig[i].WriteVertex(factory);
                }
            }

            Vertex signature = GetNativeWriter(factory).GetMethodSignature((uint)flags, 0, containingType, methodNameAndSig, args);

            return(SetSavedVertex(factory.MetadataManager.NativeLayoutInfo.LdTokenInfoSection.Place(signature)));
        }
Esempio n. 2
0
        public override Vertex WriteVertex(NodeFactory factory)
        {
            Vertex containingType   = GetContainingTypeVertex(factory);
            Vertex methodSig        = _methodSig.WriteVertex(factory);
            Vertex methodNameAndSig = GetNativeWriter(factory).GetMethodNameAndSigSignature(_method.Name, methodSig);

            Vertex[]    args  = null;
            MethodFlags flags = 0;

            if (_method.HasInstantiation)
            {
                Debug.Assert(_instantiationArgsSig == null || (_instantiationArgsSig != null && _method.Instantiation.Length == _instantiationArgsSig.Length));

                flags |= MethodFlags.HasInstantiation;
                args   = new Vertex[_method.Instantiation.Length];

                for (int i = 0; i < args.Length; i++)
                {
                    if ((_flags & MethodEntryFlags.CreateInstantiatedSignature) != 0)
                    {
                        IEETypeNode eetypeNode = factory.NecessaryTypeSymbol(_method.Instantiation[i]);
                        uint        typeIndex  = factory.MetadataManager.NativeLayoutInfo.ExternalReferences.GetIndex(eetypeNode);
                        args[i] = GetNativeWriter(factory).GetExternalTypeSignature(typeIndex);
                    }
                    else
                    {
                        args[i] = _instantiationArgsSig[i].WriteVertex(factory);
                    }
                }
            }

            uint fptrReferenceId = 0;

            if ((_flags & MethodEntryFlags.SaveEntryPoint) != 0)
            {
                flags |= MethodFlags.HasFunctionPointer;

                bool        getUnboxingStub      = _method.OwningType.IsValueType && !_method.Signature.IsStatic;
                IMethodNode methodEntryPointNode = factory.MethodEntrypoint(_method, getUnboxingStub);
                fptrReferenceId = factory.MetadataManager.NativeLayoutInfo.ExternalReferences.GetIndex(methodEntryPointNode);

                if (getUnboxingStub)
                {
                    flags |= MethodFlags.IsUnboxingStub;
                }
                if (_method.IsCanonicalMethod(CanonicalFormKind.Universal))
                {
                    flags |= MethodFlags.FunctionPointerIsUSG;
                }
            }

            return(GetNativeWriter(factory).GetMethodSignature((uint)flags, fptrReferenceId, containingType, methodNameAndSig, args));
        }
Esempio n. 3
0
        public override Vertex WriteVertex(NodeFactory factory)
        {
            Vertex methodSig = _methodSig.WriteVertex(factory);

            return(GetNativeWriter(factory).GetMethodNameAndSigSignature(_method.Name, methodSig));
        }