Welcome to mirror list, hosted at ThFree Co, Russian Federation.

MdBinaryWriterGen.cs « Generator « NativeFormat « Metadata « Internal « Common « tools « coreclr « src - github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 19e870feb39183d5e41cb564b757dc2cd372c679 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

//
// Generates the C# MdBinaryWriter class. This classes is responsible for correctly decoding
// data members in the .metadata file. See NativeFormatWriterGen.cs for how the MetadataWriter 
// use this class.
//

class MdBinaryWriterGen : CsWriter
{
    public MdBinaryWriterGen(string fileName)
        : base(fileName)
    {
    }

    public void EmitSource()
    {
        WriteLine("#pragma warning disable 649");
        WriteLine();

        WriteLine("using System;");
        WriteLine("using System.IO;");
        WriteLine("using System.Collections.Generic;");
        WriteLine("using System.Reflection;");
        WriteLine("using Internal.LowLevelLinq;");
        WriteLine("using Internal.NativeFormat;");
        WriteLine("using Debug = System.Diagnostics.Debug;");
        WriteLine();

        OpenScope("namespace Internal.Metadata.NativeFormat.Writer");

        OpenScope("internal static partial class MdBinaryWriter");

        foreach (var primitiveType in SchemaDef.PrimitiveTypes)
        {
            EmitWritePrimitiveArray(primitiveType.Name);
        }

        foreach (var enumType in SchemaDef.EnumTypes)
        {
            EmitWriteEnum(enumType);
        }

        EmitWriteArray($"MetadataRecord");

        foreach (var typeName in SchemaDef.HandleSchema)
        {
            EmitWrite(typeName);
            EmitWriteArray(typeName);
        }

        CloseScope("MdBinaryWriter");
        CloseScope("Internal.Metadata.NativeFormat.Writer");
    }

    private void EmitWritePrimitiveArray(string typeName)
    {
        OpenScope($"public static void Write(this NativeWriter writer, {typeName}[] values)");
        WriteLine("if (values == null)");
        WriteLine("{");
        WriteLine("    writer.WriteUnsigned(0);");
        WriteLine("    return;");
        WriteLine("}");
        WriteLine("writer.WriteUnsigned((uint)values.Length);");
        WriteLine($"foreach ({typeName} value in values)");
        WriteLine("{");
        WriteLine("    writer.Write(value);");
        WriteLine("}");
        CloseScope("Write");
    }

    private void EmitWriteEnum(EnumType enumType)
    {
        OpenScope($"public static void Write(this NativeWriter writer, {enumType.Name} value)");
        WriteLine($"writer.WriteUnsigned((uint)value);");
        CloseScope("Write");
    }

    private void EmitWrite(string typeName)
    {
        OpenScope($"public static void Write(this NativeWriter writer, {typeName} record)");
        WriteLine("if (record != null)");
        WriteLine("    writer.WriteUnsigned((uint)record.Handle.Offset);");
        WriteLine("else");
        WriteLine("    writer.WriteUnsigned(0);");
        CloseScope("Write");
    }

    private void EmitWriteArray(string typeName)
    {
        OpenScope($"public static void Write(this NativeWriter writer, List<{typeName}> values)");
        WriteLine("if (values == null)");
        WriteLine("{");
        WriteLine("    writer.WriteUnsigned(0);");
        WriteLine("    return;");
        WriteLine("}");
        WriteLine("writer.WriteUnsigned((uint)values.Count);");
        WriteLine($"foreach ({typeName} value in values)");
        WriteLine("{");
        WriteLine("    writer.Write(value);");
        WriteLine("}");
        CloseScope("Write");
    }
}