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); } }