Пример #1
0
        private void FinalizeMethods(ref bool paramPtrRequired)
        {
            var definitionTable = Metadata.TablesStream.GetTable <MethodDefinitionRow>(TableIndex.Method);
            var context         = new MethodBodySerializationContext(this, SymbolsProvider, DiagnosticBag);

            uint paramList = 1;

            for (uint rid = 1; rid <= definitionTable.Count; rid++)
            {
                var newToken = new MetadataToken(TableIndex.Method, rid);
                var method   = _tokenMapping.GetMethodByToken(newToken);

                // Serialize method body and update column.
                var row = definitionTable[newToken.Rid];

                definitionTable[newToken.Rid] = new MethodDefinitionRow(
                    MethodBodySerializer.SerializeMethodBody(context, method),
                    row.ImplAttributes,
                    row.Attributes,
                    row.Name,
                    row.Signature,
                    paramList);

                // Finalize parameters.
                FinalizeParametersInMethod(method, ref paramList, ref paramPtrRequired);

                // Add remaining metadata.
                AddCustomAttributes(newToken, method);
                AddSecurityDeclarations(newToken, method);
                AddImplementationMap(newToken, method.ImplementationMap);
                DefineGenericParameters(newToken, method);
            }
        }
        private void FinalizeMethodsInType(
            TypeDefinition type,
            ref bool methodPtrRequired,
            ref uint paramList,
            ref bool paramPtrRequired)
        {
            var definitionTable = Metadata.TablesStream.GetTable <MethodDefinitionRow>(TableIndex.Method);
            var pointerTable    = Metadata.TablesStream.GetTable <MethodPointerRow>(TableIndex.MethodPtr);

            var context = new MethodBodySerializationContext(this, SymbolsProvider, DiagnosticBag);

            for (int i = 0; i < type.Methods.Count; i++)
            {
                var method = type.Methods[i];

                var newToken = GetMethodDefinitionToken(method);
                if (newToken == MetadataToken.Zero)
                {
                    DiagnosticBag.RegisterException(new MetadataBuilderException(
                                                        $"An attempt was made to finalize method {method.SafeToString()}, which was not added to the .NET directory buffer yet."));
                }

                // Add method pointer row, making sure the RID is preserved.
                // We only really need the method pointer table if the next RID is not the RID that we would expect
                // from a normal sequential layout of the table.
                if (newToken.Rid != pointerTable.Count + 1)
                {
                    methodPtrRequired = true;
                }
                pointerTable.Add(new MethodPointerRow(newToken.Rid));

                // Serialize method body and update column.
                var row = definitionTable[newToken.Rid];

                definitionTable[newToken.Rid] = new MethodDefinitionRow(
                    MethodBodySerializer.SerializeMethodBody(context, method),
                    row.ImplAttributes,
                    row.Attributes,
                    row.Name,
                    row.Signature,
                    paramList);

                // Finalize parameters.
                FinalizeParametersInMethod(method, ref paramList, ref paramPtrRequired);

                // Add remaining metadata.
                AddCustomAttributes(newToken, method);
                AddSecurityDeclarations(newToken, method);
                AddImplementationMap(newToken, method.ImplementationMap);
                DefineGenericParameters(newToken, method);
            }
        }