5 // Jb Evain (jbevain@gmail.com)
7 // Copyright (c) 2008 - 2010 Jb Evain
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections.Generic;
34 using Mono.Collections.Generic;
36 using Mono.Cecil.Metadata;
39 using RVA = System.UInt32;
41 namespace Mono.Cecil {
43 abstract class ModuleReader {
45 readonly protected Image image;
46 readonly protected ModuleDefinition module;
48 protected ModuleReader (Image image, ReadingMode mode)
51 this.module = new ModuleDefinition (image);
52 this.module.ReadingMode = mode;
55 protected abstract void ReadModule ();
57 protected void ReadModuleManifest (MetadataReader reader)
59 reader.Populate (module);
61 ReadAssembly (reader);
64 void ReadAssembly (MetadataReader reader)
66 var name = reader.ReadAssemblyNameDefinition ();
68 module.kind = ModuleKind.NetModule;
72 var assembly = new AssemblyDefinition ();
75 module.assembly = assembly;
76 assembly.main_module = module;
79 public static ModuleDefinition CreateModuleFrom (Image image, ReaderParameters parameters)
81 var module = ReadModule (image, parameters);
83 ReadSymbols (module, parameters);
85 if (parameters.AssemblyResolver != null)
86 module.assembly_resolver = parameters.AssemblyResolver;
91 static void ReadSymbols (ModuleDefinition module, ReaderParameters parameters)
93 var symbol_reader_provider = parameters.SymbolReaderProvider;
95 if (symbol_reader_provider == null && parameters.ReadSymbols)
96 symbol_reader_provider = SymbolProvider.GetPlatformReaderProvider ();
98 if (symbol_reader_provider != null) {
99 module.SymbolReaderProvider = symbol_reader_provider;
101 var reader = parameters.SymbolStream != null
102 ? symbol_reader_provider.GetSymbolReader (module, parameters.SymbolStream)
103 : symbol_reader_provider.GetSymbolReader (module, module.FullyQualifiedName);
105 module.ReadSymbols (reader);
109 static ModuleDefinition ReadModule (Image image, ReaderParameters parameters)
111 var reader = CreateModuleReader (image, parameters.ReadingMode);
112 reader.ReadModule ();
113 return reader.module;
116 static ModuleReader CreateModuleReader (Image image, ReadingMode mode)
119 case ReadingMode.Immediate:
120 return new ImmediateModuleReader (image);
121 case ReadingMode.Deferred:
122 return new DeferredModuleReader (image);
124 throw new ArgumentException ();
129 sealed class ImmediateModuleReader : ModuleReader {
131 public ImmediateModuleReader (Image image)
132 : base (image, ReadingMode.Immediate)
136 protected override void ReadModule ()
138 this.module.Read (this.module, (module, reader) => {
139 ReadModuleManifest (reader);
145 public static void ReadModule (ModuleDefinition module)
147 if (module.HasAssemblyReferences)
148 Read (module.AssemblyReferences);
149 if (module.HasResources)
150 Read (module.Resources);
151 if (module.HasModuleReferences)
152 Read (module.ModuleReferences);
154 ReadTypes (module.Types);
155 if (module.HasExportedTypes)
156 Read (module.ExportedTypes);
157 if (module.HasCustomAttributes)
158 Read (module.CustomAttributes);
160 var assembly = module.Assembly;
161 if (assembly == null)
164 if (assembly.HasCustomAttributes)
165 Read (assembly.CustomAttributes);
166 if (assembly.HasSecurityDeclarations)
167 Read (assembly.SecurityDeclarations);
170 static void ReadTypes (Collection<TypeDefinition> types)
172 for (int i = 0; i < types.Count; i++)
173 ReadType (types [i]);
176 static void ReadType (TypeDefinition type)
178 ReadGenericParameters (type);
180 if (type.HasInterfaces)
181 Read (type.Interfaces);
183 if (type.HasNestedTypes)
184 ReadTypes (type.NestedTypes);
186 if (type.HasLayoutInfo)
187 Read (type.ClassSize);
195 if (type.HasProperties)
196 ReadProperties (type);
201 ReadSecurityDeclarations (type);
202 ReadCustomAttributes (type);
205 static void ReadGenericParameters (IGenericParameterProvider provider)
207 if (!provider.HasGenericParameters)
210 var parameters = provider.GenericParameters;
212 for (int i = 0; i < parameters.Count; i++) {
213 var parameter = parameters [i];
215 if (parameter.HasConstraints)
216 Read (parameter.Constraints);
218 if (parameter.HasCustomAttributes)
219 Read (parameter.CustomAttributes);
223 static void ReadSecurityDeclarations (ISecurityDeclarationProvider provider)
225 if (provider.HasSecurityDeclarations)
226 Read (provider.SecurityDeclarations);
229 static void ReadCustomAttributes (ICustomAttributeProvider provider)
231 if (provider.HasCustomAttributes)
232 Read (provider.CustomAttributes);
235 static void ReadFields (TypeDefinition type)
237 var fields = type.Fields;
239 for (int i = 0; i < fields.Count; i++) {
240 var field = fields [i];
242 if (field.HasConstant)
243 Read (field.Constant);
245 if (field.HasLayoutInfo)
249 Read (field.InitialValue);
251 if (field.HasMarshalInfo)
252 Read (field.MarshalInfo);
254 ReadCustomAttributes (field);
258 static void ReadMethods (TypeDefinition type)
260 var methods = type.Methods;
262 for (int i = 0; i < methods.Count; i++) {
263 var method = methods [i];
265 ReadGenericParameters (method);
267 if (method.HasParameters)
268 ReadParameters (method);
270 if (method.HasOverrides)
271 Read (method.Overrides);
273 if (method.IsPInvokeImpl)
274 Read (method.PInvokeInfo);
276 ReadSecurityDeclarations (method);
277 ReadCustomAttributes (method);
279 var return_type = method.MethodReturnType;
280 if (return_type.HasConstant)
281 Read (return_type.Constant);
283 if (return_type.HasMarshalInfo)
284 Read (return_type.MarshalInfo);
286 ReadCustomAttributes (return_type);
290 static void ReadParameters (MethodDefinition method)
292 var parameters = method.Parameters;
294 for (int i = 0; i < parameters.Count; i++) {
295 var parameter = parameters [i];
297 if (parameter.HasConstant)
298 Read (parameter.Constant);
300 if (parameter.HasMarshalInfo)
301 Read (parameter.MarshalInfo);
303 ReadCustomAttributes (parameter);
307 static void ReadProperties (TypeDefinition type)
309 var properties = type.Properties;
311 for (int i = 0; i < properties.Count; i++) {
312 var property = properties [i];
314 Read (property.GetMethod);
316 if (property.HasConstant)
317 Read (property.Constant);
319 ReadCustomAttributes (property);
323 static void ReadEvents (TypeDefinition type)
325 var events = type.Events;
327 for (int i = 0; i < events.Count; i++) {
328 var @event = events [i];
330 Read (@event.AddMethod);
332 ReadCustomAttributes (@event);
336 static void Read (object collection)
341 sealed class DeferredModuleReader : ModuleReader {
343 public DeferredModuleReader (Image image)
344 : base (image, ReadingMode.Deferred)
348 protected override void ReadModule ()
350 this.module.Read (this.module, (module, reader) => {
351 ReadModuleManifest (reader);
357 sealed class MetadataReader : ByteBuffer {
359 readonly internal Image image;
360 readonly internal ModuleDefinition module;
361 readonly internal MetadataSystem metadata;
363 internal IGenericContext context;
364 internal CodeReader code;
367 get { return (uint) base.position; }
368 set { base.position = (int) value; }
371 public MetadataReader (ModuleDefinition module)
372 : base (module.Image.MetadataSection.Data)
374 this.image = module.Image;
375 this.module = module;
376 this.metadata = module.MetadataSystem;
377 this.code = CodeReader.CreateCodeReader (this);
380 int GetCodedIndexSize (CodedIndex index)
382 return image.GetCodedIndexSize (index);
385 uint ReadByIndexSize (int size)
388 return ReadUInt32 ();
390 return ReadUInt16 ();
395 var blob_heap = image.BlobHeap;
396 if (blob_heap == null) {
398 return Empty<byte>.Array;
401 return blob_heap.Read (ReadBlobIndex ());
404 byte [] ReadBlob (uint signature)
406 var blob_heap = image.BlobHeap;
407 if (blob_heap == null)
408 return Empty<byte>.Array;
410 return blob_heap.Read (signature);
413 uint ReadBlobIndex ()
415 var blob_heap = image.BlobHeap;
416 return ReadByIndexSize (blob_heap != null ? blob_heap.IndexSize : 2);
421 return image.StringHeap.Read (ReadByIndexSize (image.StringHeap.IndexSize));
424 uint ReadStringIndex ()
426 return ReadByIndexSize (image.StringHeap.IndexSize);
429 uint ReadTableIndex (Table table)
431 return ReadByIndexSize (image.GetTableIndexSize (table));
434 MetadataToken ReadMetadataToken (CodedIndex index)
436 return index.GetMetadataToken (ReadByIndexSize (GetCodedIndexSize (index)));
439 int MoveTo (Table table)
441 var info = image.TableHeap [table];
442 if (info.Length != 0)
443 Position = info.Offset;
445 return (int) info.Length;
448 bool MoveTo (Table table, uint row)
450 var info = image.TableHeap [table];
451 var length = info.Length;
452 if (length == 0 || row > length)
455 Position = info.Offset + (info.RowSize * (row - 1));
459 public AssemblyNameDefinition ReadAssemblyNameDefinition ()
461 if (MoveTo (Table.Assembly) == 0)
464 var name = new AssemblyNameDefinition ();
466 name.HashAlgorithm = (AssemblyHashAlgorithm) ReadUInt32 ();
468 PopulateVersionAndFlags (name);
470 name.PublicKey = ReadBlob ();
472 PopulateNameAndCulture (name);
477 public ModuleDefinition Populate (ModuleDefinition module)
479 if (MoveTo (Table.Module) == 0)
482 Advance (2); // Generation
484 module.Name = ReadString ();
485 module.Mvid = image.GuidHeap.Read (ReadByIndexSize (image.GuidHeap.IndexSize));
490 public Collection<AssemblyNameReference> ReadAssemblyReferences ()
492 int length = MoveTo (Table.AssemblyRef);
493 var references = new Collection<AssemblyNameReference> (length);
495 for (uint i = 1; i <= length; i++) {
496 var reference = new AssemblyNameReference ();
497 reference.token = new MetadataToken (TokenType.AssemblyRef, i);
499 PopulateVersionAndFlags (reference);
501 reference.PublicKeyToken = ReadBlob ();
503 PopulateNameAndCulture (reference);
505 reference.Hash = ReadBlob ();
507 references.Add (reference);
513 public MethodDefinition ReadEntryPoint ()
515 if (module.Kind != ModuleKind.Console && module.Kind != ModuleKind.Windows)
518 var token = new MetadataToken (module.Image.EntryPointToken);
520 return GetMethodDefinition (token.RID);
523 public Collection<ModuleDefinition> ReadModules ()
525 var modules = new Collection<ModuleDefinition> (1);
526 modules.Add (this.module);
528 int length = MoveTo (Table.File);
529 for (uint i = 1; i <= length; i++) {
530 var attributes = (FileAttributes) ReadUInt32 ();
531 var name = ReadString ();
534 if (attributes != FileAttributes.ContainsMetaData)
537 var parameters = new ReaderParameters {
538 ReadingMode = module.ReadingMode,
539 SymbolReaderProvider = module.SymbolReaderProvider,
542 modules.Add (ModuleDefinition.ReadModule (
543 GetModuleFileName (name), parameters));
549 string GetModuleFileName (string name)
551 if (module.FullyQualifiedName == null)
552 throw new NotSupportedException ();
554 var path = Path.GetDirectoryName (module.FullyQualifiedName);
555 return Path.Combine (path, name);
558 public Collection<ModuleReference> ReadModuleReferences ()
560 int length = MoveTo (Table.ModuleRef);
561 var references = new Collection<ModuleReference> (length);
563 for (uint i = 1; i <= length; i++) {
564 var reference = new ModuleReference (ReadString ());
565 reference.token = new MetadataToken (TokenType.ModuleRef, i);
567 references.Add (reference);
573 public bool HasFileResource ()
575 int length = MoveTo (Table.File);
579 for (uint i = 1; i <= length; i++)
580 if (ReadFileRecord (i).Col1 == FileAttributes.ContainsNoMetaData)
586 public Collection<Resource> ReadResources ()
588 int length = MoveTo (Table.ManifestResource);
589 var resources = new Collection<Resource> (length);
591 for (int i = 1; i <= length; i++) {
592 var offset = ReadUInt32 ();
593 var flags = (ManifestResourceAttributes) ReadUInt32 ();
594 var name = ReadString ();
595 var implementation = ReadMetadataToken (CodedIndex.Implementation);
599 if (implementation.RID == 0) {
600 resource = new EmbeddedResource (name, flags, offset, this);
601 } else if (implementation.TokenType == TokenType.AssemblyRef) {
602 resource = new AssemblyLinkedResource (name, flags) {
603 Assembly = (AssemblyNameReference) GetTypeReferenceScope (implementation),
605 } else if (implementation.TokenType == TokenType.File) {
606 var file_record = ReadFileRecord (implementation.RID);
608 resource = new LinkedResource (name, flags) {
609 File = file_record.Col2,
610 hash = ReadBlob (file_record.Col3)
613 throw new NotSupportedException ();
615 resources.Add (resource);
621 Row<FileAttributes, string, uint> ReadFileRecord (uint rid)
623 var position = this.position;
625 if (!MoveTo (Table.File, rid))
626 throw new ArgumentException ();
628 var record = new Row<FileAttributes, string, uint> (
629 (FileAttributes) ReadUInt32 (),
633 this.position = position;
638 public MemoryStream GetManagedResourceStream (uint offset)
640 var rva = image.Resources.VirtualAddress;
641 var section = image.GetSectionAtVirtualAddress (rva);
642 var position = (rva - section.VirtualAddress) + offset;
643 var buffer = section.Data;
645 var length = buffer [position]
646 | (buffer [position + 1] << 8)
647 | (buffer [position + 2] << 16)
648 | (buffer [position + 3] << 24);
650 return new MemoryStream (buffer, (int) position + 4, length);
653 void PopulateVersionAndFlags (AssemblyNameReference name)
655 name.Version = new Version (
661 name.Attributes = (AssemblyAttributes) ReadUInt32 ();
664 void PopulateNameAndCulture (AssemblyNameReference name)
666 name.Name = ReadString ();
667 name.Culture = ReadString ();
670 public TypeDefinitionCollection ReadTypes ()
672 InitializeTypeDefinitions ();
673 var mtypes = metadata.Types;
674 var type_count = mtypes.Length - metadata.NestedTypes.Count;
675 var types = new TypeDefinitionCollection (module, type_count);
677 for (int i = 0; i < mtypes.Length; i++) {
678 var type = mtypes [i];
679 if (IsNested (type.Attributes))
688 void InitializeTypeDefinitions ()
690 if (metadata.Types != null)
693 InitializeNestedTypes ();
695 InitializeMethods ();
697 int length = MoveTo (Table.TypeDef);
698 var types = metadata.Types = new TypeDefinition [length];
700 for (uint i = 0; i < length; i++) {
701 if (types [i] != null)
704 types [i] = ReadType (i + 1);
708 static bool IsNested (TypeAttributes attributes)
710 switch (attributes & TypeAttributes.VisibilityMask) {
711 case TypeAttributes.NestedAssembly:
712 case TypeAttributes.NestedFamANDAssem:
713 case TypeAttributes.NestedFamily:
714 case TypeAttributes.NestedFamORAssem:
715 case TypeAttributes.NestedPrivate:
716 case TypeAttributes.NestedPublic:
723 public bool HasNestedTypes (TypeDefinition type)
726 InitializeNestedTypes ();
728 if (!metadata.TryGetNestedTypeMapping (type, out mapping))
731 return mapping.Length > 0;
734 public Collection<TypeDefinition> ReadNestedTypes (TypeDefinition type)
736 InitializeNestedTypes ();
738 if (!metadata.TryGetNestedTypeMapping (type, out mapping))
739 return new MemberDefinitionCollection<TypeDefinition> (type);
741 var nested_types = new MemberDefinitionCollection<TypeDefinition> (type, mapping.Length);
743 for (int i = 0; i < mapping.Length; i++)
744 nested_types.Add (GetTypeDefinition (mapping [i]));
746 metadata.RemoveNestedTypeMapping (type);
751 void InitializeNestedTypes ()
753 if (metadata.NestedTypes != null)
756 var length = MoveTo (Table.NestedClass);
758 metadata.NestedTypes = new Dictionary<uint, uint []> (length);
759 metadata.ReverseNestedTypes = new Dictionary<uint, uint> (length);
764 for (int i = 1; i <= length; i++) {
765 var nested = ReadTableIndex (Table.TypeDef);
766 var declaring = ReadTableIndex (Table.TypeDef);
768 AddNestedMapping (declaring, nested);
772 void AddNestedMapping (uint declaring, uint nested)
774 metadata.SetNestedTypeMapping (declaring, AddMapping (metadata.NestedTypes, declaring, nested));
775 metadata.SetReverseNestedTypeMapping (nested, declaring);
778 static TValue [] AddMapping<TKey, TValue> (Dictionary<TKey, TValue []> cache, TKey key, TValue value)
781 if (!cache.TryGetValue (key, out mapped)) {
782 mapped = new [] { value };
786 var new_mapped = new TValue [mapped.Length + 1];
787 Array.Copy (mapped, new_mapped, mapped.Length);
788 new_mapped [mapped.Length] = value;
792 TypeDefinition ReadType (uint rid)
794 if (!MoveTo (Table.TypeDef, rid))
797 var attributes = (TypeAttributes) ReadUInt32 ();
798 var name = ReadString ();
799 var @namespace = ReadString ();
800 var type = new TypeDefinition (@namespace, name, attributes);
801 type.token = new MetadataToken (TokenType.TypeDef, rid);
803 type.module = module;
805 metadata.AddTypeDefinition (type);
809 type.BaseType = GetTypeDefOrRef (ReadMetadataToken (CodedIndex.TypeDefOrRef));
811 type.fields_range = ReadFieldsRange (rid);
812 type.methods_range = ReadMethodsRange (rid);
814 if (IsNested (attributes))
815 type.DeclaringType = GetNestedTypeDeclaringType (type);
820 TypeDefinition GetNestedTypeDeclaringType (TypeDefinition type)
823 if (!metadata.TryGetReverseNestedTypeMapping (type, out declaring_rid))
826 metadata.RemoveReverseNestedTypeMapping (type);
827 return GetTypeDefinition (declaring_rid);
830 Range ReadFieldsRange (uint type_index)
832 return ReadListRange (type_index, Table.TypeDef, Table.Field);
835 Range ReadMethodsRange (uint type_index)
837 return ReadListRange (type_index, Table.TypeDef, Table.Method);
840 Range ReadListRange (uint current_index, Table current, Table target)
842 var list = new Range ();
844 list.Start = ReadTableIndex (target);
847 var current_table = image.TableHeap [current];
849 if (current_index == current_table.Length)
850 next_index = image.TableHeap [target].Length + 1;
852 var position = Position;
853 Position += (uint) (current_table.RowSize - image.GetTableIndexSize (target));
854 next_index = ReadTableIndex (target);
858 list.Length = next_index - list.Start;
863 public Row<short, int> ReadTypeLayout (TypeDefinition type)
865 InitializeTypeLayouts ();
866 Row<ushort, uint> class_layout;
867 var rid = type.token.RID;
868 if (!metadata.ClassLayouts.TryGetValue (rid, out class_layout))
869 return new Row<short, int> (Mixin.NoDataMarker, Mixin.NoDataMarker);
871 type.PackingSize = (short) class_layout.Col1;
872 type.ClassSize = (int) class_layout.Col2;
874 metadata.ClassLayouts.Remove (rid);
876 return new Row<short, int> ((short) class_layout.Col1, (int) class_layout.Col2);
879 void InitializeTypeLayouts ()
881 if (metadata.ClassLayouts != null)
884 int length = MoveTo (Table.ClassLayout);
886 var class_layouts = metadata.ClassLayouts = new Dictionary<uint, Row<ushort, uint>> (length);
888 for (uint i = 0; i < length; i++) {
889 var packing_size = ReadUInt16 ();
890 var class_size = ReadUInt32 ();
892 var parent = ReadTableIndex (Table.TypeDef);
894 class_layouts.Add (parent, new Row<ushort, uint> (packing_size, class_size));
898 public TypeReference GetTypeDefOrRef (MetadataToken token)
900 return (TypeReference) LookupToken (token);
903 public TypeDefinition GetTypeDefinition (uint rid)
905 InitializeTypeDefinitions ();
907 var type = metadata.GetTypeDefinition (rid);
911 return ReadTypeDefinition (rid);
914 TypeDefinition ReadTypeDefinition (uint rid)
916 if (!MoveTo (Table.TypeDef, rid))
919 return ReadType (rid);
922 void InitializeTypeReferences ()
924 if (metadata.TypeReferences != null)
927 metadata.TypeReferences = new TypeReference [image.GetTableLength (Table.TypeRef)];
930 public TypeReference GetTypeReference (string scope, string full_name)
932 InitializeTypeReferences ();
934 var length = metadata.TypeReferences.Length;
936 for (uint i = 1; i <= length; i++) {
937 var type = GetTypeReference (i);
939 if (type.FullName != full_name)
942 if (string.IsNullOrEmpty (scope))
945 if (type.Scope.Name == scope)
952 TypeReference GetTypeReference (uint rid)
954 InitializeTypeReferences ();
956 var type = metadata.GetTypeReference (rid);
960 type = ReadTypeReference (rid);
962 metadata.AddTypeReference (type);
967 TypeReference ReadTypeReference (uint rid)
969 if (!MoveTo (Table.TypeRef, rid))
972 TypeReference declaring_type = null;
973 IMetadataScope scope;
975 var scope_token = ReadMetadataToken (CodedIndex.ResolutionScope);
977 if (scope_token.TokenType == TokenType.TypeRef) {
978 declaring_type = GetTypeDefOrRef (scope_token);
980 scope = declaring_type != null
981 ? declaring_type.Scope
984 scope = GetTypeReferenceScope (scope_token);
986 var name = ReadString ();
987 var @namespace = ReadString ();
989 var type = new TypeReference (
995 type.DeclaringType = declaring_type;
996 type.token = new MetadataToken (TokenType.TypeRef, rid);
998 MetadataSystem.TryProcessPrimitiveType (type);
1003 IMetadataScope GetTypeReferenceScope (MetadataToken scope)
1005 switch (scope.TokenType) {
1006 // FIXME: both assembly refs and module refs should be in their
1007 // own arrays, in case of someone modify the collections before
1008 // this code is called
1009 case TokenType.AssemblyRef:
1010 return module.AssemblyReferences [(int) scope.RID - 1];
1011 case TokenType.ModuleRef:
1012 return module.ModuleReferences [(int) scope.RID - 1];
1013 case TokenType.Module:
1016 throw new NotSupportedException ();
1020 public IEnumerable<TypeReference> GetTypeReferences ()
1022 InitializeTypeReferences ();
1024 var length = image.GetTableLength (Table.TypeRef);
1026 var type_references = new TypeReference [length];
1028 for (uint i = 1; i <= length; i++)
1029 type_references [i - 1] = GetTypeReference (i);
1031 return type_references;
1034 TypeReference GetTypeSpecification (uint rid)
1036 if (!MoveTo (Table.TypeSpec, rid))
1039 var reader = ReadSignature (ReadBlobIndex ());
1040 return reader.ReadTypeSignature ();
1043 SignatureReader ReadSignature (uint signature)
1045 return new SignatureReader (signature, this);
1048 public bool HasInterfaces (TypeDefinition type)
1050 InitializeInterfaces ();
1051 MetadataToken [] mapping;
1053 return metadata.TryGetInterfaceMapping (type, out mapping);
1056 public Collection<TypeReference> ReadInterfaces (TypeDefinition type)
1058 InitializeInterfaces ();
1059 MetadataToken [] mapping;
1061 if (!metadata.TryGetInterfaceMapping (type, out mapping))
1062 return new Collection<TypeReference> ();
1064 var interfaces = new Collection<TypeReference> (mapping.Length);
1066 this.context = type;
1068 for (int i = 0; i < mapping.Length; i++)
1069 interfaces.Add (GetTypeDefOrRef (mapping [i]));
1071 metadata.RemoveInterfaceMapping (type);
1076 void InitializeInterfaces ()
1078 if (metadata.Interfaces != null)
1081 int length = MoveTo (Table.InterfaceImpl);
1083 metadata.Interfaces = new Dictionary<uint, MetadataToken []> (length);
1085 for (int i = 0; i < length; i++) {
1086 var type = ReadTableIndex (Table.TypeDef);
1087 var @interface = ReadMetadataToken (CodedIndex.TypeDefOrRef);
1089 AddInterfaceMapping (type, @interface);
1093 void AddInterfaceMapping (uint type, MetadataToken @interface)
1095 metadata.SetInterfaceMapping (type, AddMapping (metadata.Interfaces, type, @interface));
1098 public Collection<FieldDefinition> ReadFields (TypeDefinition type)
1100 var fields_range = type.fields_range;
1101 if (fields_range.Length == 0)
1102 return new MemberDefinitionCollection<FieldDefinition> (type);
1104 var fields = new MemberDefinitionCollection<FieldDefinition> (type, (int) fields_range.Length);
1105 this.context = type;
1107 MoveTo (Table.Field, fields_range.Start);
1108 for (uint i = 0; i < fields_range.Length; i++)
1109 fields.Add (ReadField (fields_range.Start + i));
1114 FieldDefinition ReadField (uint field_rid)
1116 var attributes = (FieldAttributes) ReadUInt16 ();
1117 var name = ReadString ();
1118 var signature = ReadBlobIndex ();
1120 var field = new FieldDefinition (name, attributes, ReadFieldType (signature));
1121 field.token = new MetadataToken (TokenType.Field, field_rid);
1122 metadata.AddFieldDefinition (field);
1127 void InitializeFields ()
1129 if (metadata.Fields != null)
1132 metadata.Fields = new FieldDefinition [image.GetTableLength (Table.Field)];
1135 TypeReference ReadFieldType (uint signature)
1137 var reader = ReadSignature (signature);
1139 const byte field_sig = 0x6;
1141 if (reader.ReadByte () != field_sig)
1142 throw new NotSupportedException ();
1144 return reader.ReadTypeSignature ();
1147 public int ReadFieldRVA (FieldDefinition field)
1149 InitializeFieldRVAs ();
1150 var rid = field.token.RID;
1153 if (!metadata.FieldRVAs.TryGetValue (rid, out rva))
1156 var size = GetFieldTypeSize (field.FieldType);
1158 if (size == 0 || rva == 0)
1161 metadata.FieldRVAs.Remove (rid);
1163 field.InitialValue = GetFieldInitializeValue (size, rva);
1168 byte [] GetFieldInitializeValue (int size, RVA rva)
1170 var section = image.GetSectionAtVirtualAddress (rva);
1171 if (section == null)
1172 return Empty<byte>.Array;
1174 var value = new byte [size];
1175 Buffer.BlockCopy (section.Data, (int) (rva - section.VirtualAddress), value, 0, size);
1179 static int GetFieldTypeSize (TypeReference type)
1183 switch (type.etype) {
1184 case ElementType.Boolean:
1185 case ElementType.U1:
1186 case ElementType.I1:
1189 case ElementType.U2:
1190 case ElementType.I2:
1191 case ElementType.Char:
1194 case ElementType.U4:
1195 case ElementType.I4:
1196 case ElementType.R4:
1199 case ElementType.U8:
1200 case ElementType.I8:
1201 case ElementType.R8:
1204 case ElementType.Ptr:
1205 case ElementType.FnPtr:
1208 case ElementType.CModOpt:
1209 case ElementType.CModReqD:
1210 return GetFieldTypeSize (((IModifierType) type).ElementType);
1212 var field_type = type.CheckedResolve ();
1213 if (field_type.HasLayoutInfo)
1214 size = field_type.ClassSize;
1222 void InitializeFieldRVAs ()
1224 if (metadata.FieldRVAs != null)
1227 int length = MoveTo (Table.FieldRVA);
1229 var field_rvas = metadata.FieldRVAs = new Dictionary<uint, uint> (length);
1231 for (int i = 0; i < length; i++) {
1232 var rva = ReadUInt32 ();
1233 var field = ReadTableIndex (Table.Field);
1235 field_rvas.Add (field, rva);
1239 public int ReadFieldLayout (FieldDefinition field)
1241 InitializeFieldLayouts ();
1242 var rid = field.token.RID;
1244 if (!metadata.FieldLayouts.TryGetValue (rid, out offset))
1245 return Mixin.NoDataMarker;
1247 metadata.FieldLayouts.Remove (rid);
1249 return (int) offset;
1252 void InitializeFieldLayouts ()
1254 if (metadata.FieldLayouts != null)
1257 int length = MoveTo (Table.FieldLayout);
1259 var field_layouts = metadata.FieldLayouts = new Dictionary<uint, uint> (length);
1261 for (int i = 0; i < length; i++) {
1262 var offset = ReadUInt32 ();
1263 var field = ReadTableIndex (Table.Field);
1265 field_layouts.Add (field, offset);
1269 public bool HasEvents (TypeDefinition type)
1271 InitializeEvents ();
1274 if (!metadata.TryGetEventsRange (type, out range))
1277 return range.Length > 0;
1280 public Collection<EventDefinition> ReadEvents (TypeDefinition type)
1282 InitializeEvents ();
1285 if (!metadata.TryGetEventsRange (type, out range))
1286 return new MemberDefinitionCollection<EventDefinition> (type);
1288 var events = new MemberDefinitionCollection<EventDefinition> (type, (int) range.Length);
1290 metadata.RemoveEventsRange (type);
1292 if (range.Length == 0 || !MoveTo (Table.Event, range.Start))
1295 this.context = type;
1297 for (uint i = 0; i < range.Length; i++)
1298 events.Add (ReadEvent (range.Start + i));
1303 EventDefinition ReadEvent (uint event_rid)
1305 var attributes = (EventAttributes) ReadUInt16 ();
1306 var name = ReadString ();
1307 var event_type = GetTypeDefOrRef (ReadMetadataToken (CodedIndex.TypeDefOrRef));
1309 var @event = new EventDefinition (name, attributes, event_type);
1310 @event.token = new MetadataToken (TokenType.Event, event_rid);
1314 void InitializeEvents ()
1316 if (metadata.Events != null)
1319 int length = MoveTo (Table.EventMap);
1321 metadata.Events = new Dictionary<uint, Range> (length);
1323 for (uint i = 1; i <= length; i++) {
1324 var type_rid = ReadTableIndex (Table.TypeDef);
1325 Range events_range = ReadEventsRange (i);
1326 metadata.AddEventsRange (type_rid, events_range);
1330 Range ReadEventsRange (uint rid)
1332 return ReadListRange (rid, Table.EventMap, Table.Event);
1335 public bool HasProperties (TypeDefinition type)
1337 InitializeProperties ();
1340 if (!metadata.TryGetPropertiesRange (type, out range))
1343 return range.Length > 0;
1346 public Collection<PropertyDefinition> ReadProperties (TypeDefinition type)
1348 InitializeProperties ();
1352 if (!metadata.TryGetPropertiesRange (type, out range))
1353 return new MemberDefinitionCollection<PropertyDefinition> (type);
1355 metadata.RemovePropertiesRange (type);
1357 var properties = new MemberDefinitionCollection<PropertyDefinition> (type, (int) range.Length);
1359 if (range.Length == 0 || !MoveTo (Table.Property, range.Start))
1362 this.context = type;
1364 for (uint i = 0; i < range.Length; i++)
1365 properties.Add (ReadProperty (range.Start + i));
1370 PropertyDefinition ReadProperty (uint property_rid)
1372 var attributes = (PropertyAttributes) ReadUInt16 ();
1373 var name = ReadString ();
1374 var signature = ReadBlobIndex ();
1376 var reader = ReadSignature (signature);
1377 const byte property_signature = 0x8;
1379 var calling_convention = reader.ReadByte ();
1381 if ((calling_convention & property_signature) == 0)
1382 throw new NotSupportedException ();
1384 var has_this = (calling_convention & 0x20) != 0;
1386 reader.ReadCompressedUInt32 (); // count
1388 var property = new PropertyDefinition (name, attributes, reader.ReadTypeSignature ());
1389 property.HasThis = has_this;
1390 property.token = new MetadataToken (TokenType.Property, property_rid);
1395 void InitializeProperties ()
1397 if (metadata.Properties != null)
1400 int length = MoveTo (Table.PropertyMap);
1402 metadata.Properties = new Dictionary<uint, Range> (length);
1404 for (uint i = 1; i <= length; i++) {
1405 var type_rid = ReadTableIndex (Table.TypeDef);
1406 var properties_range = ReadPropertiesRange (i);
1407 metadata.AddPropertiesRange (type_rid, properties_range);
1411 Range ReadPropertiesRange (uint rid)
1413 return ReadListRange (rid, Table.PropertyMap, Table.Property);
1416 MethodSemanticsAttributes ReadMethodSemantics (MethodDefinition method)
1418 InitializeMethodSemantics ();
1419 Row<MethodSemanticsAttributes, MetadataToken> row;
1420 if (!metadata.Semantics.TryGetValue (method.token.RID, out row))
1421 return MethodSemanticsAttributes.None;
1423 var type = method.DeclaringType;
1426 case MethodSemanticsAttributes.AddOn:
1427 GetEvent (type, row.Col2).add_method = method;
1429 case MethodSemanticsAttributes.Fire:
1430 GetEvent (type, row.Col2).invoke_method = method;
1432 case MethodSemanticsAttributes.RemoveOn:
1433 GetEvent (type, row.Col2).remove_method = method;
1435 case MethodSemanticsAttributes.Getter:
1436 GetProperty (type, row.Col2).get_method = method;
1438 case MethodSemanticsAttributes.Setter:
1439 GetProperty (type, row.Col2).set_method = method;
1441 case MethodSemanticsAttributes.Other:
1442 switch (row.Col2.TokenType) {
1443 case TokenType.Event: {
1444 var @event = GetEvent (type, row.Col2);
1445 if (@event.other_methods == null)
1446 @event.other_methods = new Collection<MethodDefinition> ();
1448 @event.other_methods.Add (method);
1451 case TokenType.Property: {
1452 var property = GetProperty (type, row.Col2);
1453 if (property.other_methods == null)
1454 property.other_methods = new Collection<MethodDefinition> ();
1456 property.other_methods.Add (method);
1461 throw new NotSupportedException ();
1465 throw new NotSupportedException ();
1468 metadata.Semantics.Remove (method.token.RID);
1473 static EventDefinition GetEvent (TypeDefinition type, MetadataToken token)
1475 if (token.TokenType != TokenType.Event)
1476 throw new ArgumentException ();
1478 return GetMember (type.Events, token);
1481 static PropertyDefinition GetProperty (TypeDefinition type, MetadataToken token)
1483 if (token.TokenType != TokenType.Property)
1484 throw new ArgumentException ();
1486 return GetMember (type.Properties, token);
1489 static TMember GetMember<TMember> (Collection<TMember> members, MetadataToken token) where TMember : IMemberDefinition
1491 for (int i = 0; i < members.Count; i++) {
1492 var member = members [i];
1493 if (member.MetadataToken == token)
1497 throw new ArgumentException ();
1500 void InitializeMethodSemantics ()
1502 if (metadata.Semantics != null)
1505 int length = MoveTo (Table.MethodSemantics);
1507 var semantics = metadata.Semantics = new Dictionary<uint, Row<MethodSemanticsAttributes, MetadataToken>> (0);
1509 for (uint i = 0; i < length; i++) {
1510 var attributes = (MethodSemanticsAttributes) ReadUInt16 ();
1511 var method_rid = ReadTableIndex (Table.Method);
1512 var association = ReadMetadataToken (CodedIndex.HasSemantics);
1514 semantics [method_rid] = new Row<MethodSemanticsAttributes, MetadataToken> (attributes, association);
1518 public PropertyDefinition ReadMethods (PropertyDefinition property)
1520 ReadAllSemantics (property.DeclaringType);
1524 public EventDefinition ReadMethods (EventDefinition @event)
1526 ReadAllSemantics (@event.DeclaringType);
1530 public MethodSemanticsAttributes ReadAllSemantics (MethodDefinition method)
1532 ReadAllSemantics (method.DeclaringType);
1534 return method.SemanticsAttributes;
1537 void ReadAllSemantics (TypeDefinition type)
1539 var methods = type.Methods;
1540 for (int i = 0; i < methods.Count; i++) {
1541 var method = methods [i];
1542 if (method.sem_attrs.HasValue)
1545 method.sem_attrs = ReadMethodSemantics (method);
1549 Range ReadParametersRange (uint method_rid)
1551 return ReadListRange (method_rid, Table.Method, Table.Param);
1554 public Collection<MethodDefinition> ReadMethods (TypeDefinition type)
1556 var methods_range = type.methods_range;
1557 if (methods_range.Length == 0)
1558 return new MemberDefinitionCollection<MethodDefinition> (type);
1560 var methods = new MemberDefinitionCollection<MethodDefinition> (type, (int) methods_range.Length);
1562 MoveTo (Table.Method, methods_range.Start);
1563 for (uint i = 0; i < methods_range.Length; i++)
1564 ReadMethod (methods_range.Start + i, methods);
1569 void InitializeMethods ()
1571 if (metadata.Methods != null)
1574 metadata.Methods = new MethodDefinition [image.GetTableLength (Table.Method)];
1577 void ReadMethod (uint method_rid, Collection<MethodDefinition> methods)
1579 var method = new MethodDefinition ();
1580 method.rva = ReadUInt32 ();
1581 method.ImplAttributes = (MethodImplAttributes) ReadUInt16 ();
1582 method.Attributes = (MethodAttributes) ReadUInt16 ();
1583 method.Name = ReadString ();
1584 method.token = new MetadataToken (TokenType.Method, method_rid);
1586 methods.Add (method); // attach method
1588 var signature = ReadBlobIndex ();
1589 var param_range = ReadParametersRange (method_rid);
1591 this.context = method;
1593 ReadMethodSignature (signature, method);
1594 metadata.AddMethodDefinition (method);
1596 if (param_range.Length == 0)
1599 var position = base.position;
1600 ReadParameters (method, param_range);
1601 base.position = position;
1604 void ReadParameters (MethodDefinition method, Range param_range)
1606 MoveTo (Table.Param, param_range.Start);
1607 for (uint i = 0; i < param_range.Length; i++) {
1608 var attributes = (ParameterAttributes) ReadUInt16 ();
1609 var sequence = ReadUInt16 ();
1610 var name = ReadString ();
1612 var parameter = sequence == 0
1613 ? method.MethodReturnType.Parameter
1614 : method.Parameters [sequence - 1];
1616 parameter.token = new MetadataToken (TokenType.Param, param_range.Start + i);
1617 parameter.Name = name;
1618 parameter.Attributes = attributes;
1622 void ReadMethodSignature (uint signature, IMethodSignature method)
1624 var reader = ReadSignature (signature);
1625 reader.ReadMethodSignature (method);
1628 public PInvokeInfo ReadPInvokeInfo (MethodDefinition method)
1630 InitializePInvokes ();
1631 Row<PInvokeAttributes, uint, uint> row;
1633 var rid = method.token.RID;
1635 if (!metadata.PInvokes.TryGetValue (rid, out row))
1638 metadata.PInvokes.Remove (rid);
1640 return new PInvokeInfo (
1642 image.StringHeap.Read (row.Col2),
1643 module.ModuleReferences [(int) row.Col3 - 1]);
1646 void InitializePInvokes ()
1648 if (metadata.PInvokes != null)
1651 int length = MoveTo (Table.ImplMap);
1653 var pinvokes = metadata.PInvokes = new Dictionary<uint, Row<PInvokeAttributes, uint, uint>> (length);
1655 for (int i = 1; i <= length; i++) {
1656 var attributes = (PInvokeAttributes) ReadUInt16 ();
1657 var method = ReadMetadataToken (CodedIndex.MemberForwarded);
1658 var name = ReadStringIndex ();
1659 var scope = ReadTableIndex (Table.File);
1661 if (method.TokenType != TokenType.Method)
1664 pinvokes.Add (method.RID, new Row<PInvokeAttributes, uint, uint> (attributes, name, scope));
1668 public bool HasGenericParameters (IGenericParameterProvider provider)
1670 InitializeGenericParameters ();
1673 if (!metadata.TryGetGenericParameterRange (provider, out range))
1676 return range.Length > 0;
1679 public Collection<GenericParameter> ReadGenericParameters (IGenericParameterProvider provider)
1681 InitializeGenericParameters ();
1684 if (!metadata.TryGetGenericParameterRange (provider, out range)
1685 || !MoveTo (Table.GenericParam, range.Start))
1686 return new Collection<GenericParameter> ();
1688 metadata.RemoveGenericParameterRange (provider);
1690 var generic_parameters = new Collection<GenericParameter> ((int) range.Length);
1692 for (uint i = 0; i < range.Length; i++) {
1693 ReadUInt16 (); // index
1694 var flags = (GenericParameterAttributes) ReadUInt16 ();
1695 ReadMetadataToken (CodedIndex.TypeOrMethodDef);
1696 var name = ReadString ();
1698 var parameter = new GenericParameter (name, provider);
1699 parameter.token = new MetadataToken (TokenType.GenericParam, range.Start + i);
1700 parameter.Attributes = flags;
1702 generic_parameters.Add (parameter);
1705 return generic_parameters;
1708 void InitializeGenericParameters ()
1710 if (metadata.GenericParameters != null)
1713 metadata.GenericParameters = InitializeRanges (
1714 Table.GenericParam, () => {
1716 var next = ReadMetadataToken (CodedIndex.TypeOrMethodDef);
1722 Dictionary<MetadataToken, Range> InitializeRanges (Table table, Func<MetadataToken> get_next)
1724 int length = MoveTo (table);
1725 var ranges = new Dictionary<MetadataToken, Range> (length);
1730 MetadataToken owner = MetadataToken.Zero;
1731 Range range = new Range (1, 0);
1733 for (uint i = 1; i <= length; i++) {
1734 var next = get_next ();
1739 } else if (next != owner) {
1741 ranges.Add (owner, range);
1742 range = new Range (i, 1);
1748 if (owner != MetadataToken.Zero)
1749 ranges.Add (owner, range);
1754 public bool HasGenericConstraints (GenericParameter generic_parameter)
1756 InitializeGenericConstraints ();
1758 MetadataToken [] mapping;
1759 if (!metadata.TryGetGenericConstraintMapping (generic_parameter, out mapping))
1762 return mapping.Length > 0;
1765 public Collection<TypeReference> ReadGenericConstraints (GenericParameter generic_parameter)
1767 InitializeGenericConstraints ();
1769 MetadataToken [] mapping;
1770 if (!metadata.TryGetGenericConstraintMapping (generic_parameter, out mapping))
1771 return new Collection<TypeReference> ();
1773 var constraints = new Collection<TypeReference> (mapping.Length);
1775 this.context = (IGenericContext) generic_parameter.Owner;
1777 for (int i = 0; i < mapping.Length; i++)
1778 constraints.Add (GetTypeDefOrRef (mapping [i]));
1780 metadata.RemoveGenericConstraintMapping (generic_parameter);
1785 void InitializeGenericConstraints ()
1787 if (metadata.GenericConstraints != null)
1790 var length = MoveTo (Table.GenericParamConstraint);
1792 metadata.GenericConstraints = new Dictionary<uint, MetadataToken []> (length);
1794 for (int i = 1; i <= length; i++)
1795 AddGenericConstraintMapping (
1796 ReadTableIndex (Table.GenericParam),
1797 ReadMetadataToken (CodedIndex.TypeDefOrRef));
1800 void AddGenericConstraintMapping (uint generic_parameter, MetadataToken constraint)
1802 metadata.SetGenericConstraintMapping (
1804 AddMapping (metadata.GenericConstraints, generic_parameter, constraint));
1807 public bool HasOverrides (MethodDefinition method)
1809 InitializeOverrides ();
1810 MetadataToken [] mapping;
1812 if (!metadata.TryGetOverrideMapping (method, out mapping))
1815 return mapping.Length > 0;
1818 public Collection<MethodReference> ReadOverrides (MethodDefinition method)
1820 InitializeOverrides ();
1822 MetadataToken [] mapping;
1823 if (!metadata.TryGetOverrideMapping (method, out mapping))
1824 return new Collection<MethodReference> ();
1826 var overrides = new Collection<MethodReference> (mapping.Length);
1828 this.context = method;
1830 for (int i = 0; i < mapping.Length; i++)
1831 overrides.Add ((MethodReference) LookupToken (mapping [i]));
1833 metadata.RemoveOverrideMapping (method);
1838 void InitializeOverrides ()
1840 if (metadata.Overrides != null)
1843 var length = MoveTo (Table.MethodImpl);
1845 metadata.Overrides = new Dictionary<uint, MetadataToken []> (length);
1847 for (int i = 1; i <= length; i++) {
1848 ReadTableIndex (Table.TypeDef);
1850 var method = ReadMetadataToken (CodedIndex.MethodDefOrRef);
1851 if (method.TokenType != TokenType.Method)
1852 throw new NotSupportedException ();
1854 var @override = ReadMetadataToken (CodedIndex.MethodDefOrRef);
1856 AddOverrideMapping (method.RID, @override);
1860 void AddOverrideMapping (uint method_rid, MetadataToken @override)
1862 metadata.SetOverrideMapping (
1864 AddMapping (metadata.Overrides, method_rid, @override));
1867 public MethodBody ReadMethodBody (MethodDefinition method)
1869 return code.ReadMethodBody (method);
1872 public CallSite ReadCallSite (MetadataToken token)
1874 if (!MoveTo (Table.StandAloneSig, token.RID))
1877 var signature = ReadBlobIndex ();
1879 var call_site = new CallSite ();
1881 ReadMethodSignature (signature, call_site);
1886 public VariableDefinitionCollection ReadVariables (MetadataToken local_var_token)
1888 if (!MoveTo (Table.StandAloneSig, local_var_token.RID))
1891 var reader = ReadSignature (ReadBlobIndex ());
1892 const byte local_sig = 0x7;
1894 if (reader.ReadByte () != local_sig)
1895 throw new NotSupportedException ();
1897 var count = reader.ReadCompressedUInt32 ();
1901 var variables = new VariableDefinitionCollection ((int) count);
1903 for (int i = 0; i < count; i++)
1904 variables.Add (new VariableDefinition (reader.ReadTypeSignature ()));
1909 public IMetadataTokenProvider LookupToken (MetadataToken token)
1911 var rid = token.RID;
1916 IMetadataTokenProvider element;
1917 var position = this.position;
1918 var context = this.context;
1920 switch (token.TokenType) {
1921 case TokenType.TypeDef:
1922 element = GetTypeDefinition (rid);
1924 case TokenType.TypeRef:
1925 element = GetTypeReference (rid);
1927 case TokenType.TypeSpec:
1928 element = GetTypeSpecification (rid);
1930 case TokenType.Field:
1931 element = GetFieldDefinition (rid);
1933 case TokenType.Method:
1934 element = GetMethodDefinition (rid);
1936 case TokenType.MemberRef:
1937 element = GetMemberReference (rid);
1939 case TokenType.MethodSpec:
1940 element = GetMethodSpecification (rid);
1943 throw new NotSupportedException ();
1946 this.position = position;
1947 this.context = context;
1952 public FieldDefinition GetFieldDefinition (uint rid)
1954 InitializeTypeDefinitions ();
1956 var field = metadata.GetFieldDefinition (rid);
1960 return LookupField (rid);
1963 FieldDefinition LookupField (uint rid)
1965 var type = metadata.GetFieldDeclaringType (rid);
1967 throw new NotSupportedException ();
1969 InitializeCollection (type.Fields);
1971 return metadata.GetFieldDefinition (rid);
1974 public MethodDefinition GetMethodDefinition (uint rid)
1976 InitializeTypeDefinitions ();
1978 var method = metadata.GetMethodDefinition (rid);
1982 return LookupMethod (rid);
1985 MethodDefinition LookupMethod (uint rid)
1987 var type = metadata.GetMethodDeclaringType (rid);
1989 throw new NotSupportedException ();
1991 InitializeCollection (type.Methods);
1993 return metadata.GetMethodDefinition (rid);
1996 MethodSpecification GetMethodSpecification (uint rid)
1998 if (!MoveTo (Table.MethodSpec, rid))
2001 var method = (MethodReference) LookupToken (
2002 ReadMetadataToken (CodedIndex.MethodDefOrRef));
2003 var signature = ReadBlobIndex ();
2005 return ReadMethodSpecSignature (signature, method);
2008 MethodSpecification ReadMethodSpecSignature (uint signature, MethodReference method)
2010 var reader = ReadSignature (signature);
2011 const byte methodspec_sig = 0x0a;
2013 var call_conv = reader.ReadByte ();
2015 if (call_conv != methodspec_sig)
2016 throw new NotSupportedException ();
2018 var instance = new GenericInstanceMethod (method);
2020 reader.ReadGenericInstanceSignature (method, instance);
2025 MemberReference GetMemberReference (uint rid)
2027 InitializeMemberReferences ();
2029 var member = metadata.GetMemberReference (rid);
2033 member = ReadMemberReference (rid);
2034 if (!member.ContainsGenericParameter)
2035 metadata.AddMemberReference (member);
2039 MemberReference ReadMemberReference (uint rid)
2041 if (!MoveTo (Table.MemberRef, rid))
2044 var token = ReadMetadataToken (CodedIndex.MemberRefParent);
2045 var name = ReadString ();
2046 var signature = ReadBlobIndex ();
2048 MemberReference member;
2050 switch (token.TokenType) {
2051 case TokenType.TypeDef:
2052 case TokenType.TypeRef:
2053 case TokenType.TypeSpec:
2054 member = ReadTypeMemberReference (token, name, signature);
2056 case TokenType.Method:
2057 member = ReadMethodMemberReference (token, name, signature);
2060 throw new NotSupportedException ();
2063 member.token = new MetadataToken (TokenType.MemberRef, rid);
2068 MemberReference ReadTypeMemberReference (MetadataToken type, string name, uint signature)
2070 var declaring_type = GetTypeDefOrRef (type);
2072 this.context = declaring_type;
2074 var member = ReadMemberReferenceSignature (signature, declaring_type);
2080 MemberReference ReadMemberReferenceSignature (uint signature, TypeReference declaring_type)
2082 var reader = ReadSignature (signature);
2083 const byte field_sig = 0x6;
2085 if (reader.buffer [reader.position] == field_sig) {
2087 var field = new FieldReference ();
2088 field.DeclaringType = declaring_type;
2089 field.FieldType = reader.ReadTypeSignature ();
2092 var method = new MethodReference ();
2093 method.DeclaringType = declaring_type;
2094 reader.ReadMethodSignature (method);
2099 MemberReference ReadMethodMemberReference (MetadataToken token, string name, uint signature)
2101 var method = GetMethodDefinition (token.RID);
2103 this.context = method;
2105 var member = ReadMemberReferenceSignature (signature, method.DeclaringType);
2111 void InitializeMemberReferences ()
2113 if (metadata.MemberReferences != null)
2116 metadata.MemberReferences = new MemberReference [image.GetTableLength (Table.MemberRef)];
2119 public IEnumerable<MemberReference> GetMemberReferences ()
2121 InitializeMemberReferences ();
2123 var length = image.GetTableLength (Table.MemberRef);
2125 var type_system = module.TypeSystem;
2127 var context = new MethodReference (string.Empty, type_system.Void);
2128 context.DeclaringType = new TypeReference (string.Empty, string.Empty, module, type_system.Corlib);
2130 var member_references = new MemberReference [length];
2132 for (uint i = 1; i <= length; i++) {
2133 this.context = context;
2134 member_references [i - 1] = GetMemberReference (i);
2137 return member_references;
2140 void InitializeConstants ()
2142 if (metadata.Constants != null)
2145 var length = MoveTo (Table.Constant);
2147 var constants = metadata.Constants = new Dictionary<MetadataToken, Row<ElementType, uint>> (length);
2149 for (uint i = 1; i <= length; i++) {
2150 var type = (ElementType) ReadUInt16 ();
2151 var owner = ReadMetadataToken (CodedIndex.HasConstant);
2152 var signature = ReadBlobIndex ();
2154 constants.Add (owner, new Row<ElementType, uint> (type, signature));
2158 public object ReadConstant (IConstantProvider owner)
2160 InitializeConstants ();
2162 Row<ElementType, uint> row;
2163 if (!metadata.Constants.TryGetValue (owner.MetadataToken, out row))
2164 return Mixin.NoValue;
2166 metadata.Constants.Remove (owner.MetadataToken);
2169 case ElementType.Class:
2170 case ElementType.Object:
2172 case ElementType.String:
2173 return ReadConstantString (ReadBlob (row.Col2));
2175 return ReadConstantPrimitive (row.Col1, row.Col2);
2179 static string ReadConstantString (byte [] blob)
2181 var length = blob.Length;
2182 if ((length & 1) == 1)
2185 return Encoding.Unicode.GetString (blob, 0, length);
2188 object ReadConstantPrimitive (ElementType type, uint signature)
2190 var reader = ReadSignature (signature);
2191 return reader.ReadConstantSignature (type);
2194 void InitializeCustomAttributes ()
2196 if (metadata.CustomAttributes != null)
2199 metadata.CustomAttributes = InitializeRanges (
2200 Table.CustomAttribute, () => {
2201 var next = ReadMetadataToken (CodedIndex.HasCustomAttribute);
2202 ReadMetadataToken (CodedIndex.CustomAttributeType);
2208 public bool HasCustomAttributes (ICustomAttributeProvider owner)
2210 InitializeCustomAttributes ();
2213 if (!metadata.TryGetCustomAttributeRange (owner, out range))
2216 return range.Length > 0;
2219 public Collection<CustomAttribute> ReadCustomAttributes (ICustomAttributeProvider owner)
2221 InitializeCustomAttributes ();
2224 if (!metadata.TryGetCustomAttributeRange (owner, out range)
2225 || !MoveTo (Table.CustomAttribute, range.Start))
2226 return new Collection<CustomAttribute> ();
2228 var custom_attributes = new Collection<CustomAttribute> ((int) range.Length);
2230 for (int i = 0; i < range.Length; i++) {
2231 ReadMetadataToken (CodedIndex.HasCustomAttribute);
2233 var constructor = (MethodReference) LookupToken (
2234 ReadMetadataToken (CodedIndex.CustomAttributeType));
2236 var signature = ReadBlobIndex ();
2238 custom_attributes.Add (new CustomAttribute (signature, constructor));
2241 metadata.RemoveCustomAttributeRange (owner);
2243 return custom_attributes;
2246 public byte [] ReadCustomAttributeBlob (uint signature)
2248 return ReadBlob (signature);
2251 public void ReadCustomAttributeSignature (CustomAttribute attribute)
2253 var reader = ReadSignature (attribute.signature);
2254 if (reader.ReadUInt16 () != 0x0001)
2255 throw new InvalidOperationException ();
2257 var constructor = attribute.Constructor;
2258 if (constructor.HasParameters)
2259 reader.ReadCustomAttributeConstructorArguments (attribute, constructor.Parameters);
2261 if (!reader.CanReadMore ())
2264 var named = reader.ReadUInt16 ();
2269 reader.ReadCustomAttributeNamedArguments (named, ref attribute.fields, ref attribute.properties);
2272 void InitializeMarshalInfos ()
2274 if (metadata.FieldMarshals != null)
2277 var length = MoveTo (Table.FieldMarshal);
2279 var marshals = metadata.FieldMarshals = new Dictionary<MetadataToken, uint> (length);
2281 for (int i = 0; i < length; i++) {
2282 var token = ReadMetadataToken (CodedIndex.HasFieldMarshal);
2283 var signature = ReadBlobIndex ();
2287 marshals.Add (token, signature);
2291 public bool HasMarshalInfo (IMarshalInfoProvider owner)
2293 InitializeMarshalInfos ();
2295 return metadata.FieldMarshals.ContainsKey (owner.MetadataToken);
2298 public MarshalInfo ReadMarshalInfo (IMarshalInfoProvider owner)
2300 InitializeMarshalInfos ();
2303 if (!metadata.FieldMarshals.TryGetValue (owner.MetadataToken, out signature))
2306 var reader = ReadSignature (signature);
2308 metadata.FieldMarshals.Remove (owner.MetadataToken);
2310 return reader.ReadMarshalInfo ();
2313 void InitializeSecurityDeclarations ()
2315 if (metadata.SecurityDeclarations != null)
2318 metadata.SecurityDeclarations = InitializeRanges (
2319 Table.DeclSecurity, () => {
2321 var next = ReadMetadataToken (CodedIndex.HasDeclSecurity);
2327 public bool HasSecurityDeclarations (ISecurityDeclarationProvider owner)
2329 InitializeSecurityDeclarations ();
2332 if (!metadata.TryGetSecurityDeclarationRange (owner, out range))
2335 return range.Length > 0;
2338 public Collection<SecurityDeclaration> ReadSecurityDeclarations (ISecurityDeclarationProvider owner)
2340 InitializeSecurityDeclarations ();
2343 if (!metadata.TryGetSecurityDeclarationRange (owner, out range)
2344 || !MoveTo (Table.DeclSecurity, range.Start))
2345 return new Collection<SecurityDeclaration> ();
2347 var security_declarations = new Collection<SecurityDeclaration> ((int) range.Length);
2349 for (int i = 0; i < range.Length; i++) {
2350 var action = (SecurityAction) ReadUInt16 ();
2351 ReadMetadataToken (CodedIndex.HasDeclSecurity);
2352 var signature = ReadBlobIndex ();
2354 security_declarations.Add (new SecurityDeclaration (action, signature, module));
2357 metadata.RemoveSecurityDeclarationRange (owner);
2359 return security_declarations;
2362 public byte [] ReadSecurityDeclarationBlob (uint signature)
2364 return ReadBlob (signature);
2367 public void ReadSecurityDeclarationSignature (SecurityDeclaration declaration)
2369 var signature = declaration.signature;
2370 var reader = ReadSignature (signature);
2372 if (reader.buffer [reader.position] != '.') {
2373 ReadXmlSecurityDeclaration (signature, declaration);
2378 var count = reader.ReadCompressedUInt32 ();
2379 var attributes = new Collection<SecurityAttribute> ((int) count);
2381 for (int i = 0; i < count; i++)
2382 attributes.Add (reader.ReadSecurityAttribute ());
2384 declaration.security_attributes = attributes;
2387 void ReadXmlSecurityDeclaration (uint signature, SecurityDeclaration declaration)
2389 var blob = ReadBlob (signature);
2390 var attributes = new Collection<SecurityAttribute> (1);
2392 var attribute = new SecurityAttribute (
2393 module.TypeSystem.LookupType ("System.Security.Permissions", "PermissionSetAttribute"));
2395 attribute.properties = new Collection<CustomAttributeNamedArgument> (1);
2396 attribute.properties.Add (
2397 new CustomAttributeNamedArgument (
2399 new CustomAttributeArgument (
2400 module.TypeSystem.String,
2401 Encoding.Unicode.GetString (blob, 0, blob.Length))));
2403 attributes.Add (attribute);
2405 declaration.security_attributes = attributes;
2408 public Collection<ExportedType> ReadExportedTypes ()
2410 var length = MoveTo (Table.ExportedType);
2412 return new Collection<ExportedType> ();
2414 var exported_types = new Collection<ExportedType> (length);
2416 for (int i = 1; i <= length; i++) {
2417 var attributes = (TypeAttributes) ReadUInt32 ();
2418 var identifier = ReadUInt32 ();
2419 var name = ReadString ();
2420 var @namespace = ReadString ();
2421 var implementation = ReadMetadataToken (CodedIndex.Implementation);
2423 ExportedType declaring_type = null;
2424 IMetadataScope scope = null;
2426 switch (implementation.TokenType) {
2427 case TokenType.AssemblyRef:
2428 case TokenType.File:
2429 scope = GetExportedTypeScope (implementation);
2431 case TokenType.ExportedType:
2432 // FIXME: if the table is not properly sorted
2433 declaring_type = exported_types [(int) implementation.RID - 1];
2437 var exported_type = new ExportedType (@namespace, name, scope) {
2438 Attributes = attributes,
2439 Identifier = (int) identifier,
2440 DeclaringType = declaring_type,
2442 exported_type.token = new MetadataToken (TokenType.ExportedType, i);
2444 exported_types.Add (exported_type);
2447 return exported_types;
2450 IMetadataScope GetExportedTypeScope (MetadataToken token)
2452 switch (token.TokenType) {
2453 case TokenType.AssemblyRef:
2454 return module.AssemblyReferences [(int) token.RID - 1];
2455 case TokenType.File:
2456 var position = this.position;
2457 var reference = GetModuleReferenceFromFile (token);
2458 this.position = position;
2460 if (reference == null)
2461 throw new NotSupportedException ();
2465 throw new NotSupportedException ();
2469 ModuleReference GetModuleReferenceFromFile (MetadataToken token)
2471 if (!MoveTo (Table.File, token.RID))
2475 var file_name = ReadString ();
2476 var modules = module.ModuleReferences;
2478 ModuleReference reference = null;
2479 for (int i = 0; i < modules.Count; i++) {
2480 var module_reference = modules [i];
2481 if (module_reference.Name != file_name)
2484 reference = module_reference;
2491 static void InitializeCollection (object o)
2496 sealed class SignatureReader : ByteBuffer {
2498 readonly MetadataReader reader;
2499 readonly uint start, sig_length;
2501 TypeSystem TypeSystem {
2502 get { return reader.module.TypeSystem; }
2505 public SignatureReader (uint blob, MetadataReader reader)
2506 : base (reader.buffer)
2508 this.reader = reader;
2512 this.sig_length = ReadCompressedUInt32 ();
2513 this.start = (uint) position;
2516 void MoveToBlob (uint blob)
2518 position = (int) (reader.image.BlobHeap.Offset + blob);
2521 MetadataToken ReadTypeTokenSignature ()
2523 return CodedIndex.TypeDefOrRef.GetMetadataToken (ReadCompressedUInt32 ());
2526 GenericParameter GetGenericParameter (GenericParameterType type, uint var)
2528 var context = reader.context;
2530 if (context == null)
2531 throw new NotSupportedException ();
2533 IGenericParameterProvider provider;
2536 case GenericParameterType.Type:
2537 provider = context.Type;
2539 case GenericParameterType.Method:
2540 provider = context.Method;
2543 throw new NotSupportedException ();
2546 int index = (int) var;
2548 if (!context.IsDefinition)
2549 CheckGenericContext (provider, index);
2551 return provider.GenericParameters [index];
2554 static void CheckGenericContext (IGenericParameterProvider owner, int index)
2556 var owner_parameters = owner.GenericParameters;
2558 for (int i = owner_parameters.Count; i <= index; i++)
2559 owner_parameters.Add (new GenericParameter (owner));
2562 public void ReadGenericInstanceSignature (IGenericParameterProvider provider, IGenericInstance instance)
2564 var arity = ReadCompressedUInt32 ();
2566 if (!provider.IsDefinition)
2567 CheckGenericContext (provider, (int) arity - 1);
2569 var instance_arguments = instance.GenericArguments;
2571 for (int i = 0; i < arity; i++)
2572 instance_arguments.Add (ReadTypeSignature ());
2575 ArrayType ReadArrayTypeSignature ()
2577 var array = new ArrayType (ReadTypeSignature ());
2579 var rank = ReadCompressedUInt32 ();
2581 var sizes = new uint [ReadCompressedUInt32 ()];
2582 for (int i = 0; i < sizes.Length; i++)
2583 sizes [i] = ReadCompressedUInt32 ();
2585 var low_bounds = new int [ReadCompressedUInt32 ()];
2586 for (int i = 0; i < low_bounds.Length; i++)
2587 low_bounds [i] = ReadCompressedInt32 ();
2589 array.Dimensions.Clear ();
2591 for (int i = 0; i < rank; i++) {
2592 int? lower = null, upper = null;
2594 if (i < low_bounds.Length)
2595 lower = low_bounds [i];
2597 if (i < sizes.Length)
2598 upper = lower + (int) sizes [i] - 1;
2600 array.Dimensions.Add (new ArrayDimension (lower, upper));
2606 TypeReference GetTypeDefOrRef (MetadataToken token)
2608 return reader.GetTypeDefOrRef (token);
2611 public TypeReference ReadTypeSignature ()
2613 return ReadTypeSignature ((ElementType) ReadByte ());
2616 TypeReference ReadTypeSignature (ElementType etype)
2619 case ElementType.ValueType: {
2620 var value_type = GetTypeDefOrRef (ReadTypeTokenSignature ());
2621 value_type.IsValueType = true;
2624 case ElementType.Class:
2625 return GetTypeDefOrRef (ReadTypeTokenSignature ());
2626 case ElementType.Ptr:
2627 return new PointerType (ReadTypeSignature ());
2628 case ElementType.FnPtr: {
2629 var fptr = new FunctionPointerType ();
2630 ReadMethodSignature (fptr);
2633 case ElementType.ByRef:
2634 return new ByReferenceType (ReadTypeSignature ());
2635 case ElementType.Pinned:
2636 return new PinnedType (ReadTypeSignature ());
2637 case ElementType.SzArray:
2638 return new ArrayType (ReadTypeSignature ());
2639 case ElementType.Array:
2640 return ReadArrayTypeSignature ();
2641 case ElementType.CModOpt:
2642 return new OptionalModifierType (
2643 GetTypeDefOrRef (ReadTypeTokenSignature ()), ReadTypeSignature ());
2644 case ElementType.CModReqD:
2645 return new RequiredModifierType (
2646 GetTypeDefOrRef (ReadTypeTokenSignature ()), ReadTypeSignature ());
2647 case ElementType.Sentinel:
2648 return new SentinelType (ReadTypeSignature ());
2649 case ElementType.Var:
2650 return GetGenericParameter (GenericParameterType.Type, ReadCompressedUInt32 ());
2651 case ElementType.MVar:
2652 return GetGenericParameter (GenericParameterType.Method, ReadCompressedUInt32 ());
2653 case ElementType.GenericInst: {
2654 var is_value_type = ReadByte () == (byte) ElementType.ValueType;
2655 var element_type = GetTypeDefOrRef (ReadTypeTokenSignature ());
2656 var generic_instance = new GenericInstanceType (element_type);
2658 ReadGenericInstanceSignature (element_type, generic_instance);
2660 if (is_value_type) {
2661 generic_instance.IsValueType = true;
2662 element_type.GetElementType ().IsValueType = true;
2665 return generic_instance;
2667 case ElementType.Object: return TypeSystem.Object;
2668 case ElementType.Void: return TypeSystem.Void;
2669 case ElementType.TypedByRef: return TypeSystem.TypedReference;
2670 case ElementType.I: return TypeSystem.IntPtr;
2671 case ElementType.U: return TypeSystem.UIntPtr;
2672 default: return GetPrimitiveType (etype);
2676 public void ReadMethodSignature (IMethodSignature method)
2678 var calling_convention = ReadByte ();
2679 method.CallingConvention = (MethodCallingConvention) calling_convention;
2680 method.HasThis = (calling_convention & 0x20) != 0;
2681 method.ExplicitThis = (calling_convention & 0x40) != 0;
2683 var generic_context = method as MethodReference;
2684 if (generic_context != null)
2685 reader.context = generic_context;
2687 if ((calling_convention & 0x10) != 0) {
2688 var arity = ReadCompressedUInt32 ();
2690 if (generic_context != null && !generic_context.IsDefinition)
2691 CheckGenericContext (generic_context, (int) arity -1 );
2694 // TODO: more call_conv
2696 var param_count = ReadCompressedUInt32 ();
2698 method.MethodReturnType.ReturnType = ReadTypeSignature ();
2700 if (param_count == 0)
2703 Collection<ParameterDefinition> parameters;
2705 var method_ref = method as MethodReference;
2706 if (method_ref != null)
2707 parameters = method_ref.parameters = new ParameterDefinitionCollection (method, (int) param_count);
2709 parameters = method.Parameters;
2711 for (int i = 0; i < param_count; i++)
2712 parameters.Add (new ParameterDefinition (ReadTypeSignature ()));
2715 public object ReadConstantSignature (ElementType type)
2717 return ReadPrimitiveValue (type);
2720 public void ReadCustomAttributeConstructorArguments (CustomAttribute attribute, Collection<ParameterDefinition> parameters)
2722 var count = parameters.Count;
2726 attribute.arguments = new Collection<CustomAttributeArgument> (count);
2728 for (int i = 0; i < count; i++)
2729 attribute.arguments.Add (
2730 ReadCustomAttributeFixedArgument (parameters [i].ParameterType));
2733 CustomAttributeArgument ReadCustomAttributeFixedArgument (TypeReference type)
2736 return ReadCustomAttributeFixedArrayArgument ((ArrayType) type);
2738 return ReadCustomAttributeElement (type);
2741 public void ReadCustomAttributeNamedArguments (ushort count, ref Collection<CustomAttributeNamedArgument> fields, ref Collection<CustomAttributeNamedArgument> properties)
2743 for (int i = 0; i < count; i++)
2744 ReadCustomAttributeNamedArgument (ref fields, ref properties);
2747 void ReadCustomAttributeNamedArgument (ref Collection<CustomAttributeNamedArgument> fields, ref Collection<CustomAttributeNamedArgument> properties)
2749 var kind = ReadByte ();
2750 var type = ReadCustomAttributeFieldOrPropType ();
2751 var name = ReadUTF8String ();
2753 Collection<CustomAttributeNamedArgument> container;
2756 container = GetCustomAttributeNamedArgumentCollection (ref fields);
2759 container = GetCustomAttributeNamedArgumentCollection (ref properties);
2762 throw new NotSupportedException ();
2765 container.Add (new CustomAttributeNamedArgument (name, ReadCustomAttributeFixedArgument (type)));
2768 static Collection<CustomAttributeNamedArgument> GetCustomAttributeNamedArgumentCollection (ref Collection<CustomAttributeNamedArgument> collection)
2770 if (collection != null)
2773 return collection = new Collection<CustomAttributeNamedArgument> ();
2776 CustomAttributeArgument ReadCustomAttributeFixedArrayArgument (ArrayType type)
2778 var length = ReadUInt32 ();
2780 if (length == 0xffffffff)
2781 return new CustomAttributeArgument (type, null);
2784 return new CustomAttributeArgument (type, Empty<CustomAttributeArgument>.Array);
2786 var arguments = new CustomAttributeArgument [length];
2787 var element_type = type.ElementType;
2789 for (int i = 0; i < length; i++)
2790 arguments [i] = ReadCustomAttributeElement (element_type);
2792 return new CustomAttributeArgument (type, arguments);
2795 CustomAttributeArgument ReadCustomAttributeElement (TypeReference type)
2798 return ReadCustomAttributeFixedArrayArgument ((ArrayType) type);
2800 if (type.etype == ElementType.Object)
2801 return ReadCustomAttributeElement (ReadCustomAttributeFieldOrPropType ());
2803 return new CustomAttributeArgument (type, ReadCustomAttributeElementValue (type));
2806 object ReadCustomAttributeElementValue (TypeReference type)
2808 var etype = type.etype;
2811 case ElementType.String:
2812 return ReadUTF8String ();
2813 case ElementType.None:
2814 if (type.IsTypeOf ("System", "Type"))
2815 return ReadTypeReference ();
2817 return ReadCustomAttributeEnum (type);
2819 return ReadPrimitiveValue (etype);
2823 object ReadPrimitiveValue (ElementType type)
2826 case ElementType.Boolean:
2827 return ReadByte () == 1;
2828 case ElementType.I1:
2829 return (sbyte) ReadByte ();
2830 case ElementType.U1:
2832 case ElementType.Char:
2833 return (char) ReadUInt16 ();
2834 case ElementType.I2:
2835 return ReadInt16 ();
2836 case ElementType.U2:
2837 return ReadUInt16 ();
2838 case ElementType.I4:
2839 return ReadInt32 ();
2840 case ElementType.U4:
2841 return ReadUInt32 ();
2842 case ElementType.I8:
2843 return ReadInt64 ();
2844 case ElementType.U8:
2845 return ReadUInt64 ();
2846 case ElementType.R4:
2847 return ReadSingle ();
2848 case ElementType.R8:
2849 return ReadDouble ();
2851 throw new NotImplementedException (type.ToString ());
2855 TypeReference GetPrimitiveType (ElementType etype)
2858 case ElementType.Boolean:
2859 return TypeSystem.Boolean;
2860 case ElementType.Char:
2861 return TypeSystem.Char;
2862 case ElementType.I1:
2863 return TypeSystem.SByte;
2864 case ElementType.U1:
2865 return TypeSystem.Byte;
2866 case ElementType.I2:
2867 return TypeSystem.Int16;
2868 case ElementType.U2:
2869 return TypeSystem.UInt16;
2870 case ElementType.I4:
2871 return TypeSystem.Int32;
2872 case ElementType.U4:
2873 return TypeSystem.UInt32;
2874 case ElementType.I8:
2875 return TypeSystem.Int64;
2876 case ElementType.U8:
2877 return TypeSystem.UInt64;
2878 case ElementType.R4:
2879 return TypeSystem.Single;
2880 case ElementType.R8:
2881 return TypeSystem.Double;
2882 case ElementType.String:
2883 return TypeSystem.String;
2885 throw new NotImplementedException (etype.ToString ());
2889 TypeReference ReadCustomAttributeFieldOrPropType ()
2891 var etype = (ElementType) ReadByte ();
2894 case ElementType.Boxed:
2895 return TypeSystem.Object;
2896 case ElementType.SzArray:
2897 return new ArrayType (ReadCustomAttributeFieldOrPropType ());
2898 case ElementType.Enum:
2899 return ReadTypeReference ();
2900 case ElementType.Type:
2901 return TypeSystem.LookupType ("System", "Type");
2903 return GetPrimitiveType (etype);
2907 public TypeReference ReadTypeReference ()
2909 return TypeParser.ParseType (reader.module, ReadUTF8String ());
2912 object ReadCustomAttributeEnum (TypeReference enum_type)
2914 var type = enum_type.CheckedResolve ();
2916 throw new ArgumentException ();
2918 return ReadCustomAttributeElementValue (type.GetEnumUnderlyingType ());
2921 public SecurityAttribute ReadSecurityAttribute ()
2923 var attribute = new SecurityAttribute (ReadTypeReference ());
2925 ReadCompressedUInt32 ();
2927 ReadCustomAttributeNamedArguments (
2928 (ushort) ReadCompressedUInt32 (),
2929 ref attribute.fields,
2930 ref attribute.properties);
2935 public MarshalInfo ReadMarshalInfo ()
2937 var native = ReadNativeType ();
2939 case NativeType.Array: {
2940 var array = new ArrayMarshalInfo ();
2942 array.element_type = ReadNativeType ();
2944 array.size_parameter_index = (int) ReadCompressedUInt32 ();
2946 array.size = (int) ReadCompressedUInt32 ();
2948 array.size_parameter_multiplier = (int) ReadCompressedUInt32 ();
2951 case NativeType.SafeArray: {
2952 var array = new SafeArrayMarshalInfo ();
2954 array.element_type = ReadVariantType ();
2957 case NativeType.FixedArray: {
2958 var array = new FixedArrayMarshalInfo ();
2960 array.size = (int) ReadCompressedUInt32 ();
2962 array.element_type = ReadNativeType ();
2965 case NativeType.FixedSysString: {
2966 var sys_string = new FixedSysStringMarshalInfo ();
2968 sys_string.size = (int) ReadCompressedUInt32 ();
2971 case NativeType.CustomMarshaler: {
2972 var marshaler = new CustomMarshalInfo ();
2973 var guid_value = ReadUTF8String ();
2974 marshaler.guid = !string.IsNullOrEmpty (guid_value) ? new Guid (guid_value) : Guid.Empty;
2975 marshaler.unmanaged_type = ReadUTF8String ();
2976 marshaler.managed_type = ReadTypeReference ();
2977 marshaler.cookie = ReadUTF8String ();
2981 return new MarshalInfo (native);
2985 NativeType ReadNativeType ()
2987 return (NativeType) ReadByte ();
2990 VariantType ReadVariantType ()
2992 return (VariantType) ReadByte ();
2995 string ReadUTF8String ()
2997 if (buffer [position] == 0xff) {
3002 var length = (int) ReadCompressedUInt32 ();
3004 return string.Empty;
3006 var @string = Encoding.UTF8.GetString (buffer, position,
3007 buffer [position + length - 1] == 0 ? length - 1 : length);
3013 public bool CanReadMore ()
3015 return position - start < sig_length;