Seal non-visible classes.
[mono.git] / mcs / class / Mono.Cecil / Mono.Cecil.Metadata / MetadataRowReader.cs
1 //
2 // MetadataRowReader.cs
3 //
4 // Author:
5 //   Jb Evain (jbevain@gmail.com)
6 //
7 // Generated by /CodeGen/cecil-gen.rb do not edit
8 // Sat Feb 16 23:24:17 +0100 2008
9 //
10 // (C) 2005 Jb Evain
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 namespace Mono.Cecil.Metadata {
33
34         using System;
35         using System.Collections;
36         using System.IO;
37
38         using Mono.Cecil.Binary;
39
40         sealed class MetadataRowReader : BaseMetadataRowVisitor {
41
42                 MetadataTableReader m_mtrv;
43                 BinaryReader m_binaryReader;
44                 MetadataRoot m_metadataRoot;
45
46                 Utilities.TableRowCounter m_counter;
47                 int [] m_ciCache;
48
49                 int m_blobHeapIdxSz;
50                 int m_stringsHeapIdxSz;
51                 int m_guidHeapIdxSz;
52
53                 public MetadataRowReader (MetadataTableReader mtrv)
54                 {
55                         m_mtrv = mtrv;
56                         m_binaryReader = mtrv.GetReader ();
57                         m_metadataRoot = mtrv.GetMetadataRoot ();
58                         m_ciCache = new int [13];
59                         m_counter = new Utilities.TableRowCounter (m_mtrv.GetNumberOfRows);
60                 }
61
62                 int GetIndexSize (int rid)
63                 {
64                         return m_mtrv.GetNumberOfRows (rid) < (1 << 16) ? 2 : 4;
65                 }
66
67                 int GetCodedIndexSize (CodedIndex ci)
68                 {
69                         return Utilities.GetCodedIndexSize (ci, m_counter, m_ciCache);
70                 }
71
72                 uint ReadByIndexSize (int size)
73                 {
74                         if (size == 2) {
75                                 return (uint) m_binaryReader.ReadUInt16 ();
76                         } else if (size == 4) {
77                                 return m_binaryReader.ReadUInt32 ();
78                         } else {
79                                 throw new MetadataFormatException ("Non valid size for indexing");
80                         }
81                 }
82
83                 public override void VisitRowCollection (RowCollection coll)
84                 {
85                         m_blobHeapIdxSz = m_metadataRoot.Streams.BlobHeap != null ?
86                                 m_metadataRoot.Streams.BlobHeap.IndexSize : 2;
87                         m_stringsHeapIdxSz = m_metadataRoot.Streams.StringsHeap != null ?
88                                 m_metadataRoot.Streams.StringsHeap.IndexSize : 2;
89                         m_guidHeapIdxSz = m_metadataRoot.Streams.GuidHeap != null ?
90                                 m_metadataRoot.Streams.GuidHeap.IndexSize : 2;
91                 }
92
93                 public override void VisitAssemblyRow (AssemblyRow row)
94                 {
95                         row.HashAlgId = (Mono.Cecil.AssemblyHashAlgorithm) m_binaryReader.ReadUInt32 ();
96                         row.MajorVersion = m_binaryReader.ReadUInt16 ();
97                         row.MinorVersion = m_binaryReader.ReadUInt16 ();
98                         row.BuildNumber = m_binaryReader.ReadUInt16 ();
99                         row.RevisionNumber = m_binaryReader.ReadUInt16 ();
100                         row.Flags = (Mono.Cecil.AssemblyFlags) m_binaryReader.ReadUInt32 ();
101                         row.PublicKey = ReadByIndexSize (m_blobHeapIdxSz);
102                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
103                         row.Culture = ReadByIndexSize (m_stringsHeapIdxSz);
104                 }
105                 public override void VisitAssemblyOSRow (AssemblyOSRow row)
106                 {
107                         row.OSPlatformID = m_binaryReader.ReadUInt32 ();
108                         row.OSMajorVersion = m_binaryReader.ReadUInt32 ();
109                         row.OSMinorVersion = m_binaryReader.ReadUInt32 ();
110                 }
111                 public override void VisitAssemblyProcessorRow (AssemblyProcessorRow row)
112                 {
113                         row.Processor = m_binaryReader.ReadUInt32 ();
114                 }
115                 public override void VisitAssemblyRefRow (AssemblyRefRow row)
116                 {
117                         row.MajorVersion = m_binaryReader.ReadUInt16 ();
118                         row.MinorVersion = m_binaryReader.ReadUInt16 ();
119                         row.BuildNumber = m_binaryReader.ReadUInt16 ();
120                         row.RevisionNumber = m_binaryReader.ReadUInt16 ();
121                         row.Flags = (Mono.Cecil.AssemblyFlags) m_binaryReader.ReadUInt32 ();
122                         row.PublicKeyOrToken = ReadByIndexSize (m_blobHeapIdxSz);
123                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
124                         row.Culture = ReadByIndexSize (m_stringsHeapIdxSz);
125                         row.HashValue = ReadByIndexSize (m_blobHeapIdxSz);
126                 }
127                 public override void VisitAssemblyRefOSRow (AssemblyRefOSRow row)
128                 {
129                         row.OSPlatformID = m_binaryReader.ReadUInt32 ();
130                         row.OSMajorVersion = m_binaryReader.ReadUInt32 ();
131                         row.OSMinorVersion = m_binaryReader.ReadUInt32 ();
132                         row.AssemblyRef = ReadByIndexSize (GetIndexSize (AssemblyRefTable.RId));
133                 }
134                 public override void VisitAssemblyRefProcessorRow (AssemblyRefProcessorRow row)
135                 {
136                         row.Processor = m_binaryReader.ReadUInt32 ();
137                         row.AssemblyRef = ReadByIndexSize (GetIndexSize (AssemblyRefTable.RId));
138                 }
139                 public override void VisitClassLayoutRow (ClassLayoutRow row)
140                 {
141                         row.PackingSize = m_binaryReader.ReadUInt16 ();
142                         row.ClassSize = m_binaryReader.ReadUInt32 ();
143                         row.Parent = ReadByIndexSize (GetIndexSize (TypeDefTable.RId));
144                 }
145                 public override void VisitConstantRow (ConstantRow row)
146                 {
147                         row.Type = (Mono.Cecil.Metadata.ElementType) m_binaryReader.ReadUInt16 ();
148                         row.Parent = Utilities.GetMetadataToken (CodedIndex.HasConstant,
149                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.HasConstant)));
150                         row.Value = ReadByIndexSize (m_blobHeapIdxSz);
151                 }
152                 public override void VisitCustomAttributeRow (CustomAttributeRow row)
153                 {
154                         row.Parent = Utilities.GetMetadataToken (CodedIndex.HasCustomAttribute,
155                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.HasCustomAttribute)));
156                         row.Type = Utilities.GetMetadataToken (CodedIndex.CustomAttributeType,
157                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.CustomAttributeType)));
158                         row.Value = ReadByIndexSize (m_blobHeapIdxSz);
159                 }
160                 public override void VisitDeclSecurityRow (DeclSecurityRow row)
161                 {
162                         row.Action = (Mono.Cecil.SecurityAction) m_binaryReader.ReadInt16 ();
163                         row.Parent = Utilities.GetMetadataToken (CodedIndex.HasDeclSecurity,
164                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.HasDeclSecurity)));
165                         row.PermissionSet = ReadByIndexSize (m_blobHeapIdxSz);
166                 }
167                 public override void VisitEventRow (EventRow row)
168                 {
169                         row.EventFlags = (Mono.Cecil.EventAttributes) m_binaryReader.ReadUInt16 ();
170                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
171                         row.EventType = Utilities.GetMetadataToken (CodedIndex.TypeDefOrRef,
172                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.TypeDefOrRef)));
173                 }
174                 public override void VisitEventMapRow (EventMapRow row)
175                 {
176                         row.Parent = ReadByIndexSize (GetIndexSize (TypeDefTable.RId));
177                         row.EventList = ReadByIndexSize (GetIndexSize (EventTable.RId));
178                 }
179                 public override void VisitEventPtrRow (EventPtrRow row)
180                 {
181                         row.Event = ReadByIndexSize (GetIndexSize (EventTable.RId));
182                 }
183                 public override void VisitExportedTypeRow (ExportedTypeRow row)
184                 {
185                         row.Flags = (Mono.Cecil.TypeAttributes) m_binaryReader.ReadUInt32 ();
186                         row.TypeDefId = m_binaryReader.ReadUInt32 ();
187                         row.TypeName = ReadByIndexSize (m_stringsHeapIdxSz);
188                         row.TypeNamespace = ReadByIndexSize (m_stringsHeapIdxSz);
189                         row.Implementation = Utilities.GetMetadataToken (CodedIndex.Implementation,
190                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.Implementation)));
191                 }
192                 public override void VisitFieldRow (FieldRow row)
193                 {
194                         row.Flags = (Mono.Cecil.FieldAttributes) m_binaryReader.ReadUInt16 ();
195                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
196                         row.Signature = ReadByIndexSize (m_blobHeapIdxSz);
197                 }
198                 public override void VisitFieldLayoutRow (FieldLayoutRow row)
199                 {
200                         row.Offset = m_binaryReader.ReadUInt32 ();
201                         row.Field = ReadByIndexSize (GetIndexSize (FieldTable.RId));
202                 }
203                 public override void VisitFieldMarshalRow (FieldMarshalRow row)
204                 {
205                         row.Parent = Utilities.GetMetadataToken (CodedIndex.HasFieldMarshal,
206                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.HasFieldMarshal)));
207                         row.NativeType = ReadByIndexSize (m_blobHeapIdxSz);
208                 }
209                 public override void VisitFieldPtrRow (FieldPtrRow row)
210                 {
211                         row.Field = ReadByIndexSize (GetIndexSize (FieldTable.RId));
212                 }
213                 public override void VisitFieldRVARow (FieldRVARow row)
214                 {
215                         row.RVA = new RVA (m_binaryReader.ReadUInt32 ());
216                         row.Field = ReadByIndexSize (GetIndexSize (FieldTable.RId));
217                 }
218                 public override void VisitFileRow (FileRow row)
219                 {
220                         row.Flags = (Mono.Cecil.FileAttributes) m_binaryReader.ReadUInt32 ();
221                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
222                         row.HashValue = ReadByIndexSize (m_blobHeapIdxSz);
223                 }
224                 public override void VisitGenericParamRow (GenericParamRow row)
225                 {
226                         row.Number = m_binaryReader.ReadUInt16 ();
227                         row.Flags = (Mono.Cecil.GenericParameterAttributes) m_binaryReader.ReadUInt16 ();
228                         row.Owner = Utilities.GetMetadataToken (CodedIndex.TypeOrMethodDef,
229                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.TypeOrMethodDef)));
230                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
231                 }
232                 public override void VisitGenericParamConstraintRow (GenericParamConstraintRow row)
233                 {
234                         row.Owner = ReadByIndexSize (GetIndexSize (GenericParamTable.RId));
235                         row.Constraint = Utilities.GetMetadataToken (CodedIndex.TypeDefOrRef,
236                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.TypeDefOrRef)));
237                 }
238                 public override void VisitImplMapRow (ImplMapRow row)
239                 {
240                         row.MappingFlags = (Mono.Cecil.PInvokeAttributes) m_binaryReader.ReadUInt16 ();
241                         row.MemberForwarded = Utilities.GetMetadataToken (CodedIndex.MemberForwarded,
242                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.MemberForwarded)));
243                         row.ImportName = ReadByIndexSize (m_stringsHeapIdxSz);
244                         row.ImportScope = ReadByIndexSize (GetIndexSize (ModuleRefTable.RId));
245                 }
246                 public override void VisitInterfaceImplRow (InterfaceImplRow row)
247                 {
248                         row.Class = ReadByIndexSize (GetIndexSize (TypeDefTable.RId));
249                         row.Interface = Utilities.GetMetadataToken (CodedIndex.TypeDefOrRef,
250                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.TypeDefOrRef)));
251                 }
252                 public override void VisitManifestResourceRow (ManifestResourceRow row)
253                 {
254                         row.Offset = m_binaryReader.ReadUInt32 ();
255                         row.Flags = (Mono.Cecil.ManifestResourceAttributes) m_binaryReader.ReadUInt32 ();
256                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
257                         row.Implementation = Utilities.GetMetadataToken (CodedIndex.Implementation,
258                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.Implementation)));
259                 }
260                 public override void VisitMemberRefRow (MemberRefRow row)
261                 {
262                         row.Class = Utilities.GetMetadataToken (CodedIndex.MemberRefParent,
263                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.MemberRefParent)));
264                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
265                         row.Signature = ReadByIndexSize (m_blobHeapIdxSz);
266                 }
267                 public override void VisitMethodRow (MethodRow row)
268                 {
269                         row.RVA = new RVA (m_binaryReader.ReadUInt32 ());
270                         row.ImplFlags = (Mono.Cecil.MethodImplAttributes) m_binaryReader.ReadUInt16 ();
271                         row.Flags = (Mono.Cecil.MethodAttributes) m_binaryReader.ReadUInt16 ();
272                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
273                         row.Signature = ReadByIndexSize (m_blobHeapIdxSz);
274                         row.ParamList = ReadByIndexSize (GetIndexSize (ParamTable.RId));
275                 }
276                 public override void VisitMethodImplRow (MethodImplRow row)
277                 {
278                         row.Class = ReadByIndexSize (GetIndexSize (TypeDefTable.RId));
279                         row.MethodBody = Utilities.GetMetadataToken (CodedIndex.MethodDefOrRef,
280                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.MethodDefOrRef)));
281                         row.MethodDeclaration = Utilities.GetMetadataToken (CodedIndex.MethodDefOrRef,
282                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.MethodDefOrRef)));
283                 }
284                 public override void VisitMethodPtrRow (MethodPtrRow row)
285                 {
286                         row.Method = ReadByIndexSize (GetIndexSize (MethodTable.RId));
287                 }
288                 public override void VisitMethodSemanticsRow (MethodSemanticsRow row)
289                 {
290                         row.Semantics = (Mono.Cecil.MethodSemanticsAttributes) m_binaryReader.ReadUInt16 ();
291                         row.Method = ReadByIndexSize (GetIndexSize (MethodTable.RId));
292                         row.Association = Utilities.GetMetadataToken (CodedIndex.HasSemantics,
293                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.HasSemantics)));
294                 }
295                 public override void VisitMethodSpecRow (MethodSpecRow row)
296                 {
297                         row.Method = Utilities.GetMetadataToken (CodedIndex.MethodDefOrRef,
298                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.MethodDefOrRef)));
299                         row.Instantiation = ReadByIndexSize (m_blobHeapIdxSz);
300                 }
301                 public override void VisitModuleRow (ModuleRow row)
302                 {
303                         row.Generation = m_binaryReader.ReadUInt16 ();
304                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
305                         row.Mvid = ReadByIndexSize (m_guidHeapIdxSz);
306                         row.EncId = ReadByIndexSize (m_guidHeapIdxSz);
307                         row.EncBaseId = ReadByIndexSize (m_guidHeapIdxSz);
308                 }
309                 public override void VisitModuleRefRow (ModuleRefRow row)
310                 {
311                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
312                 }
313                 public override void VisitNestedClassRow (NestedClassRow row)
314                 {
315                         row.NestedClass = ReadByIndexSize (GetIndexSize (TypeDefTable.RId));
316                         row.EnclosingClass = ReadByIndexSize (GetIndexSize (TypeDefTable.RId));
317                 }
318                 public override void VisitParamRow (ParamRow row)
319                 {
320                         row.Flags = (Mono.Cecil.ParameterAttributes) m_binaryReader.ReadUInt16 ();
321                         row.Sequence = m_binaryReader.ReadUInt16 ();
322                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
323                 }
324                 public override void VisitParamPtrRow (ParamPtrRow row)
325                 {
326                         row.Param = ReadByIndexSize (GetIndexSize (ParamTable.RId));
327                 }
328                 public override void VisitPropertyRow (PropertyRow row)
329                 {
330                         row.Flags = (Mono.Cecil.PropertyAttributes) m_binaryReader.ReadUInt16 ();
331                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
332                         row.Type = ReadByIndexSize (m_blobHeapIdxSz);
333                 }
334                 public override void VisitPropertyMapRow (PropertyMapRow row)
335                 {
336                         row.Parent = ReadByIndexSize (GetIndexSize (TypeDefTable.RId));
337                         row.PropertyList = ReadByIndexSize (GetIndexSize (PropertyTable.RId));
338                 }
339                 public override void VisitPropertyPtrRow (PropertyPtrRow row)
340                 {
341                         row.Property = ReadByIndexSize (GetIndexSize (PropertyTable.RId));
342                 }
343                 public override void VisitStandAloneSigRow (StandAloneSigRow row)
344                 {
345                         row.Signature = ReadByIndexSize (m_blobHeapIdxSz);
346                 }
347                 public override void VisitTypeDefRow (TypeDefRow row)
348                 {
349                         row.Flags = (Mono.Cecil.TypeAttributes) m_binaryReader.ReadUInt32 ();
350                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
351                         row.Namespace = ReadByIndexSize (m_stringsHeapIdxSz);
352                         row.Extends = Utilities.GetMetadataToken (CodedIndex.TypeDefOrRef,
353                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.TypeDefOrRef)));
354                         row.FieldList = ReadByIndexSize (GetIndexSize (FieldTable.RId));
355                         row.MethodList = ReadByIndexSize (GetIndexSize (MethodTable.RId));
356                 }
357                 public override void VisitTypeRefRow (TypeRefRow row)
358                 {
359                         row.ResolutionScope = Utilities.GetMetadataToken (CodedIndex.ResolutionScope,
360                                 ReadByIndexSize (GetCodedIndexSize (CodedIndex.ResolutionScope)));
361                         row.Name = ReadByIndexSize (m_stringsHeapIdxSz);
362                         row.Namespace = ReadByIndexSize (m_stringsHeapIdxSz);
363                 }
364                 public override void VisitTypeSpecRow (TypeSpecRow row)
365                 {
366                         row.Signature = ReadByIndexSize (m_blobHeapIdxSz);
367                 }
368         }
369 }