private void CreateTypeDefinitionTable(RuntimeType type, string assemblySymbol) { string typeNameSymbol = type + @"$tname"; // Emit type name using (Stream stream = linker.Allocate(typeNameSymbol, SectionKind.ROData, 0, typeLayout.NativePointerAlignment)) { using (EndianAwareBinaryWriter writer = new EndianAwareBinaryWriter(stream, architecture.IsLittleEndian)) { EmitStringWithLength(writer, type.FullName); } } string typeTableSymbol = type.FullName + @"$dtable"; using (Stream stream = linker.Allocate(typeTableSymbol, SectionKind.ROData, 0, typeLayout.NativePointerAlignment)) { using (EndianAwareBinaryWriter writer = new EndianAwareBinaryWriter(stream, architecture.IsLittleEndian)) { // 1. Size writer.Write((uint)typeLayout.GetTypeSize(type)); // 2. Metadata Token writer.Write((uint)type.Token.ToUInt32()); // 3. Pointer to Name linker.Link(LinkType.AbsoluteAddress | LinkType.NativeI4, typeTableSymbol, (int)writer.Position, 0, typeNameSymbol, IntPtr.Zero); writer.Position += typeLayout.NativePointerSize; // 4. Pointer to Assembly Definition linker.Link(LinkType.AbsoluteAddress | LinkType.NativeI4, typeTableSymbol, (int)writer.Position, 0, assemblySymbol, IntPtr.Zero); writer.Position += typeLayout.NativePointerSize; // 5. TODO: Constructor that accept no parameters, if any, for this type writer.WriteZeroBytes(typeLayout.NativePointerSize); // 6. Flag: IsInterface writer.WriteByte((byte)(type.IsInterface ? 1 : 0)); } } }
private void CreateTypeDefinitionTable(MosaType type) { string typeNameSymbol = type + @"$tname"; // Emit type name using (Stream stream = Linker.Allocate(typeNameSymbol, SectionKind.ROData, 0, TypeLayout.NativePointerAlignment)) { using (EndianAwareBinaryWriter writer = new EndianAwareBinaryWriter(stream, Architecture.Endianness)) { EmitStringWithLength(writer, type.FullName); } } string typeTableSymbol = type.FullName + @"$dtable"; using (Stream stream = Linker.Allocate(typeTableSymbol, SectionKind.ROData, 0, TypeLayout.NativePointerAlignment)) { using (EndianAwareBinaryWriter writer = new EndianAwareBinaryWriter(stream, Architecture.Endianness)) { // 1. Size writer.Write((uint)TypeLayout.GetTypeSize(type)); // 2. Metadata Token //writer.Write((uint)type.Token.ToUInt32()); writer.Write((uint)0); //FIXME! ^^^ // 3. Pointer to Name Linker.Link(LinkType.AbsoluteAddress | LinkType.I4, BuiltInPatch.I4, typeTableSymbol, (int)writer.Position, 0, typeNameSymbol, 0); writer.Position += TypeLayout.NativePointerSize; // 4. Pointer to Assembly Definition //linker.Link(LinkType.AbsoluteAddress | LinkType.I4, BuiltInPatch.I4, typeTableSymbol, (int)writer.Position, 0, assemblySymbol, 0); writer.Position += TypeLayout.NativePointerSize; // 5. TODO: Constructor that accepts no parameters, if any, for this type writer.WriteZeroBytes(TypeLayout.NativePointerSize); // 6. Flag: IsInterface writer.WriteByte((byte)(type.IsInterface ? 1 : 0)); } } CreateFieldDefinitions(type); }