a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
603 lines
15 KiB
C#
603 lines
15 KiB
C#
//
|
|
// MetadataTableWriter.cs
|
|
//
|
|
// Author:
|
|
// Jb Evain (jbevain@gmail.com)
|
|
//
|
|
// Generated by /CodeGen/cecil-gen.rb do not edit
|
|
// Thu Feb 22 14:39:38 CET 2007
|
|
//
|
|
// (C) 2005 Jb Evain
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
|
|
namespace Mono.Cecil.Metadata {
|
|
|
|
using System;
|
|
using System.Collections;
|
|
|
|
using Mono.Cecil.Binary;
|
|
|
|
internal sealed class MetadataTableWriter : BaseMetadataTableVisitor {
|
|
|
|
MetadataRoot m_root;
|
|
TablesHeap m_heap;
|
|
MetadataRowWriter m_mrrw;
|
|
MemoryBinaryWriter m_binaryWriter;
|
|
|
|
public MetadataTableWriter (MetadataWriter mrv, MemoryBinaryWriter writer)
|
|
{
|
|
m_root = mrv.GetMetadataRoot ();
|
|
m_heap = m_root.Streams.TablesHeap;
|
|
m_binaryWriter = writer;
|
|
m_mrrw = new MetadataRowWriter (this);
|
|
}
|
|
|
|
public MetadataRoot GetMetadataRoot ()
|
|
{
|
|
return m_root;
|
|
}
|
|
|
|
public override IMetadataRowVisitor GetRowVisitor ()
|
|
{
|
|
return m_mrrw;
|
|
}
|
|
|
|
public MemoryBinaryWriter GetWriter ()
|
|
{
|
|
return m_binaryWriter;
|
|
}
|
|
|
|
void InitializeTable (IMetadataTable table)
|
|
{
|
|
table.Rows = new RowCollection ();
|
|
m_heap.Valid |= 1L << table.Id;
|
|
m_heap.Tables.Add (table);
|
|
}
|
|
|
|
void WriteCount (int rid)
|
|
{
|
|
if (m_heap.HasTable (rid))
|
|
m_binaryWriter.Write (m_heap [rid].Rows.Count);
|
|
}
|
|
|
|
public AssemblyTable GetAssemblyTable ()
|
|
{
|
|
AssemblyTable table = m_heap [AssemblyTable.RId] as AssemblyTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new AssemblyTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public AssemblyOSTable GetAssemblyOSTable ()
|
|
{
|
|
AssemblyOSTable table = m_heap [AssemblyOSTable.RId] as AssemblyOSTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new AssemblyOSTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public AssemblyProcessorTable GetAssemblyProcessorTable ()
|
|
{
|
|
AssemblyProcessorTable table = m_heap [AssemblyProcessorTable.RId] as AssemblyProcessorTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new AssemblyProcessorTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public AssemblyRefTable GetAssemblyRefTable ()
|
|
{
|
|
AssemblyRefTable table = m_heap [AssemblyRefTable.RId] as AssemblyRefTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new AssemblyRefTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public AssemblyRefOSTable GetAssemblyRefOSTable ()
|
|
{
|
|
AssemblyRefOSTable table = m_heap [AssemblyRefOSTable.RId] as AssemblyRefOSTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new AssemblyRefOSTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public AssemblyRefProcessorTable GetAssemblyRefProcessorTable ()
|
|
{
|
|
AssemblyRefProcessorTable table = m_heap [AssemblyRefProcessorTable.RId] as AssemblyRefProcessorTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new AssemblyRefProcessorTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ClassLayoutTable GetClassLayoutTable ()
|
|
{
|
|
ClassLayoutTable table = m_heap [ClassLayoutTable.RId] as ClassLayoutTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ClassLayoutTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ConstantTable GetConstantTable ()
|
|
{
|
|
ConstantTable table = m_heap [ConstantTable.RId] as ConstantTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ConstantTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public CustomAttributeTable GetCustomAttributeTable ()
|
|
{
|
|
CustomAttributeTable table = m_heap [CustomAttributeTable.RId] as CustomAttributeTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new CustomAttributeTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public DeclSecurityTable GetDeclSecurityTable ()
|
|
{
|
|
DeclSecurityTable table = m_heap [DeclSecurityTable.RId] as DeclSecurityTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new DeclSecurityTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public EventTable GetEventTable ()
|
|
{
|
|
EventTable table = m_heap [EventTable.RId] as EventTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new EventTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public EventMapTable GetEventMapTable ()
|
|
{
|
|
EventMapTable table = m_heap [EventMapTable.RId] as EventMapTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new EventMapTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public EventPtrTable GetEventPtrTable ()
|
|
{
|
|
EventPtrTable table = m_heap [EventPtrTable.RId] as EventPtrTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new EventPtrTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ExportedTypeTable GetExportedTypeTable ()
|
|
{
|
|
ExportedTypeTable table = m_heap [ExportedTypeTable.RId] as ExportedTypeTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ExportedTypeTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public FieldTable GetFieldTable ()
|
|
{
|
|
FieldTable table = m_heap [FieldTable.RId] as FieldTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new FieldTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public FieldLayoutTable GetFieldLayoutTable ()
|
|
{
|
|
FieldLayoutTable table = m_heap [FieldLayoutTable.RId] as FieldLayoutTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new FieldLayoutTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public FieldMarshalTable GetFieldMarshalTable ()
|
|
{
|
|
FieldMarshalTable table = m_heap [FieldMarshalTable.RId] as FieldMarshalTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new FieldMarshalTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public FieldPtrTable GetFieldPtrTable ()
|
|
{
|
|
FieldPtrTable table = m_heap [FieldPtrTable.RId] as FieldPtrTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new FieldPtrTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public FieldRVATable GetFieldRVATable ()
|
|
{
|
|
FieldRVATable table = m_heap [FieldRVATable.RId] as FieldRVATable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new FieldRVATable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public FileTable GetFileTable ()
|
|
{
|
|
FileTable table = m_heap [FileTable.RId] as FileTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new FileTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public GenericParamTable GetGenericParamTable ()
|
|
{
|
|
GenericParamTable table = m_heap [GenericParamTable.RId] as GenericParamTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new GenericParamTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public GenericParamConstraintTable GetGenericParamConstraintTable ()
|
|
{
|
|
GenericParamConstraintTable table = m_heap [GenericParamConstraintTable.RId] as GenericParamConstraintTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new GenericParamConstraintTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ImplMapTable GetImplMapTable ()
|
|
{
|
|
ImplMapTable table = m_heap [ImplMapTable.RId] as ImplMapTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ImplMapTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public InterfaceImplTable GetInterfaceImplTable ()
|
|
{
|
|
InterfaceImplTable table = m_heap [InterfaceImplTable.RId] as InterfaceImplTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new InterfaceImplTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ManifestResourceTable GetManifestResourceTable ()
|
|
{
|
|
ManifestResourceTable table = m_heap [ManifestResourceTable.RId] as ManifestResourceTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ManifestResourceTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public MemberRefTable GetMemberRefTable ()
|
|
{
|
|
MemberRefTable table = m_heap [MemberRefTable.RId] as MemberRefTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new MemberRefTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public MethodTable GetMethodTable ()
|
|
{
|
|
MethodTable table = m_heap [MethodTable.RId] as MethodTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new MethodTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public MethodImplTable GetMethodImplTable ()
|
|
{
|
|
MethodImplTable table = m_heap [MethodImplTable.RId] as MethodImplTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new MethodImplTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public MethodPtrTable GetMethodPtrTable ()
|
|
{
|
|
MethodPtrTable table = m_heap [MethodPtrTable.RId] as MethodPtrTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new MethodPtrTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public MethodSemanticsTable GetMethodSemanticsTable ()
|
|
{
|
|
MethodSemanticsTable table = m_heap [MethodSemanticsTable.RId] as MethodSemanticsTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new MethodSemanticsTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public MethodSpecTable GetMethodSpecTable ()
|
|
{
|
|
MethodSpecTable table = m_heap [MethodSpecTable.RId] as MethodSpecTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new MethodSpecTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ModuleTable GetModuleTable ()
|
|
{
|
|
ModuleTable table = m_heap [ModuleTable.RId] as ModuleTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ModuleTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ModuleRefTable GetModuleRefTable ()
|
|
{
|
|
ModuleRefTable table = m_heap [ModuleRefTable.RId] as ModuleRefTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ModuleRefTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public NestedClassTable GetNestedClassTable ()
|
|
{
|
|
NestedClassTable table = m_heap [NestedClassTable.RId] as NestedClassTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new NestedClassTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ParamTable GetParamTable ()
|
|
{
|
|
ParamTable table = m_heap [ParamTable.RId] as ParamTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ParamTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public ParamPtrTable GetParamPtrTable ()
|
|
{
|
|
ParamPtrTable table = m_heap [ParamPtrTable.RId] as ParamPtrTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new ParamPtrTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public PropertyTable GetPropertyTable ()
|
|
{
|
|
PropertyTable table = m_heap [PropertyTable.RId] as PropertyTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new PropertyTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public PropertyMapTable GetPropertyMapTable ()
|
|
{
|
|
PropertyMapTable table = m_heap [PropertyMapTable.RId] as PropertyMapTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new PropertyMapTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public PropertyPtrTable GetPropertyPtrTable ()
|
|
{
|
|
PropertyPtrTable table = m_heap [PropertyPtrTable.RId] as PropertyPtrTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new PropertyPtrTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public StandAloneSigTable GetStandAloneSigTable ()
|
|
{
|
|
StandAloneSigTable table = m_heap [StandAloneSigTable.RId] as StandAloneSigTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new StandAloneSigTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public TypeDefTable GetTypeDefTable ()
|
|
{
|
|
TypeDefTable table = m_heap [TypeDefTable.RId] as TypeDefTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new TypeDefTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public TypeRefTable GetTypeRefTable ()
|
|
{
|
|
TypeRefTable table = m_heap [TypeRefTable.RId] as TypeRefTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new TypeRefTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public TypeSpecTable GetTypeSpecTable ()
|
|
{
|
|
TypeSpecTable table = m_heap [TypeSpecTable.RId] as TypeSpecTable;
|
|
if (table != null)
|
|
return table;
|
|
|
|
table = new TypeSpecTable ();
|
|
InitializeTable (table);
|
|
return table;
|
|
}
|
|
|
|
public override void VisitTableCollection (TableCollection coll)
|
|
{
|
|
WriteCount (ModuleTable.RId);
|
|
WriteCount (TypeRefTable.RId);
|
|
WriteCount (TypeDefTable.RId);
|
|
WriteCount (FieldPtrTable.RId);
|
|
WriteCount (FieldTable.RId);
|
|
WriteCount (MethodPtrTable.RId);
|
|
WriteCount (MethodTable.RId);
|
|
WriteCount (ParamPtrTable.RId);
|
|
WriteCount (ParamTable.RId);
|
|
WriteCount (InterfaceImplTable.RId);
|
|
WriteCount (MemberRefTable.RId);
|
|
WriteCount (ConstantTable.RId);
|
|
WriteCount (CustomAttributeTable.RId);
|
|
WriteCount (FieldMarshalTable.RId);
|
|
WriteCount (DeclSecurityTable.RId);
|
|
WriteCount (ClassLayoutTable.RId);
|
|
WriteCount (FieldLayoutTable.RId);
|
|
WriteCount (StandAloneSigTable.RId);
|
|
WriteCount (EventMapTable.RId);
|
|
WriteCount (EventPtrTable.RId);
|
|
WriteCount (EventTable.RId);
|
|
WriteCount (PropertyMapTable.RId);
|
|
WriteCount (PropertyPtrTable.RId);
|
|
WriteCount (PropertyTable.RId);
|
|
WriteCount (MethodSemanticsTable.RId);
|
|
WriteCount (MethodImplTable.RId);
|
|
WriteCount (ModuleRefTable.RId);
|
|
WriteCount (TypeSpecTable.RId);
|
|
WriteCount (ImplMapTable.RId);
|
|
WriteCount (FieldRVATable.RId);
|
|
WriteCount (AssemblyTable.RId);
|
|
WriteCount (AssemblyProcessorTable.RId);
|
|
WriteCount (AssemblyOSTable.RId);
|
|
WriteCount (AssemblyRefTable.RId);
|
|
WriteCount (AssemblyRefProcessorTable.RId);
|
|
WriteCount (AssemblyRefOSTable.RId);
|
|
WriteCount (FileTable.RId);
|
|
WriteCount (ExportedTypeTable.RId);
|
|
WriteCount (ManifestResourceTable.RId);
|
|
WriteCount (NestedClassTable.RId);
|
|
WriteCount (GenericParamTable.RId);
|
|
WriteCount (MethodSpecTable.RId);
|
|
WriteCount (GenericParamConstraintTable.RId);
|
|
}
|
|
}
|
|
}
|