Mono.CompilerServices.SymbolWriter.MonoSymbolFile.Write C# (CSharp) Method

Write() private method

private Write ( MyBinaryWriter bw, System.Guid guid ) : void
bw MyBinaryWriter
guid System.Guid
return void
        void Write(MyBinaryWriter bw, Guid guid)
        {
            // Magic number and file version.
            bw.Write (OffsetTable.Magic);
            bw.Write (MajorVersion);
            bw.Write (MinorVersion);

            bw.Write (guid.ToByteArray ());

            //
            // Offsets of file sections; we must write this after we're done
            // writing the whole file, so we just reserve the space for it here.
            //
            long offset_table_offset = bw.BaseStream.Position;
            ot.Write (bw, MajorVersion, MinorVersion);

            //
            // Sort the methods according to their tokens and update their index.
            //
            methods.Sort ();
            for (int i = 0; i < methods.Count; i++)
                methods [i].Index = i + 1;

            //
            // Write data sections.
            //
            ot.DataSectionOffset = (int) bw.BaseStream.Position;
            foreach (SourceFileEntry source in sources)
                source.WriteData (bw);
            foreach (CompileUnitEntry comp_unit in comp_units)
                comp_unit.WriteData (bw);
            foreach (MethodEntry method in methods)
                method.WriteData (this, bw);
            ot.DataSectionSize = (int) bw.BaseStream.Position - ot.DataSectionOffset;

            //
            // Write the method index table.
            //
            ot.MethodTableOffset = (int) bw.BaseStream.Position;
            for (int i = 0; i < methods.Count; i++) {
                MethodEntry entry = methods [i];
                entry.Write (bw);
            }
            ot.MethodTableSize = (int) bw.BaseStream.Position - ot.MethodTableOffset;

            //
            // Write source table.
            //
            ot.SourceTableOffset = (int) bw.BaseStream.Position;
            for (int i = 0; i < sources.Count; i++) {
                SourceFileEntry source = sources [i];
                source.Write (bw);
            }
            ot.SourceTableSize = (int) bw.BaseStream.Position - ot.SourceTableOffset;

            //
            // Write compilation unit table.
            //
            ot.CompileUnitTableOffset = (int) bw.BaseStream.Position;
            for (int i = 0; i < comp_units.Count; i++) {
                CompileUnitEntry unit = comp_units [i];
                unit.Write (bw);
            }
            ot.CompileUnitTableSize = (int) bw.BaseStream.Position - ot.CompileUnitTableOffset;

            //
            // Write anonymous scope table.
            //
            ot.AnonymousScopeCount = anonymous_scopes != null ? anonymous_scopes.Count : 0;
            ot.AnonymousScopeTableOffset = (int) bw.BaseStream.Position;
            if (anonymous_scopes != null) {
                foreach (AnonymousScopeEntry scope in anonymous_scopes.Values)
                    scope.Write (bw);
            }
            ot.AnonymousScopeTableSize = (int) bw.BaseStream.Position - ot.AnonymousScopeTableOffset;

            //
            // Fixup offset table.
            //
            ot.TypeCount = last_type_index;
            ot.MethodCount = methods.Count;
            ot.SourceCount = sources.Count;
            ot.CompileUnitCount = comp_units.Count;

            //
            // Write offset table.
            //
            ot.TotalFileSize = (int) bw.BaseStream.Position;
            bw.Seek ((int) offset_table_offset, SeekOrigin.Begin);
            ot.Write (bw, MajorVersion, MinorVersion);
            bw.Seek (0, SeekOrigin.End);

            #if false
            Console.WriteLine ("TOTAL: {0} line numbes, {1} bytes, extended {2} bytes, " +
                       "{3} methods.", NumLineNumbers, LineNumberSize,
                       ExtendedLineNumberSize, methods.Count);
            #endif
        }