Skip to content

Commit b16bc8e

Browse files
authored
Fix issue with bye code output (#44)
1 parent e90543f commit b16bc8e

File tree

11 files changed

+77
-26
lines changed

11 files changed

+77
-26
lines changed

source/MetadataProcessor.Console/Program.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,15 @@ public void Compile(
6363

6464
_assemblyBuilder = new nanoAssemblyBuilder(_assemblyDefinition, _classNamesToExclude, VerboseMinimize, isCoreLibrary);
6565

66-
using (var stream = File.Open(fileName, FileMode.Create, FileAccess.ReadWrite))
66+
using (var stream = File.Open(Path.ChangeExtension(fileName, "tmp"), FileMode.Create, FileAccess.ReadWrite))
6767
using (var writer = new BinaryWriter(stream))
6868
{
6969
_assemblyBuilder.Write(GetBinaryWriter(writer));
7070
}
7171

72+
// OK to delete tmp PE file
73+
File.Delete(Path.ChangeExtension(fileName, "tmp"));
74+
7275
if (Verbose) System.Console.WriteLine("Minimizing assembly...");
7376

7477
_assemblyBuilder.Minimize();

source/MetadataProcessor.Core/Tables/nanoAssemblyReferenceTable.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ protected override void WriteSingleItem(
5555
nanoBinaryWriter writer,
5656
AssemblyNameReference item)
5757
{
58+
if (!_context.MinimizeComplete)
59+
{
60+
return;
61+
}
62+
5863
WriteStringReference(writer, item.Name);
5964
writer.WriteUInt16(0); // padding
6065

source/MetadataProcessor.Core/Tables/nanoByteCodeTable.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ public sealed class nanoByteCodeTable : InanoTable
2424
private readonly IList<MethodDefinition> _methods = new List<MethodDefinition>();
2525

2626
/// <summary>
27-
/// Maps method full names to method RVAs (offsets in resutling table).
27+
/// Maps method full names to method RVAs (offsets in resulting table).
2828
/// </summary>
2929
private readonly IDictionary<string, ushort> _rvasByMethodNames =
3030
new Dictionary<string, ushort>(StringComparer.Ordinal);
3131

3232
/// <summary>
33-
/// Temprorary string table for code generators used duing initial load.
33+
/// Temporary string table for code generators used during initial load.
3434
/// </summary>
3535
private readonly nanoStringTable _fakeStringTable = new nanoStringTable();
3636

@@ -57,12 +57,12 @@ public nanoByteCodeTable(
5757
}
5858

5959
/// <summary>
60-
/// Next method identifier. Used for reproducing strange original MetadataProcessor behavior.
60+
/// Next method identifier. Used for reproducing strange original MetadataProcessor behaviour.
6161
/// </summary>
6262
public ushort NextMethodId { get { return (ushort)_methods.Count; } }
6363

6464
/// <summary>
65-
/// Temprorary string table for code generators used duing initial load.
65+
/// Temporary string table for code generators used duing initial load.
6666
/// </summary>
6767
public nanoStringTable FakeStringTable { get { return _fakeStringTable; } }
6868

source/MetadataProcessor.Core/Tables/nanoFieldDefinitionTable.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ protected override void WriteSingleItem(
6666
nanoBinaryWriter writer,
6767
FieldDefinition item)
6868
{
69+
if (!_context.MinimizeComplete)
70+
{
71+
return;
72+
}
73+
6974
WriteStringReference(writer, item.Name);
7075
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
7176

source/MetadataProcessor.Core/Tables/nanoFieldReferenceTable.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ protected override void WriteSingleItem(
6868
nanoBinaryWriter writer,
6969
FieldReference item)
7070
{
71+
if (!_context.MinimizeComplete)
72+
{
73+
return;
74+
}
75+
7176
ushort referenceId;
7277
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);
7378

source/MetadataProcessor.Core/Tables/nanoMethodDefinitionTable.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
using Mono.Cecil;
12
using System;
23
using System.Collections.Generic;
3-
using Mono.Cecil;
44

55
namespace nanoFramework.Tools.MetadataProcessor
66
{
@@ -62,6 +62,11 @@ protected override void WriteSingleItem(
6262
nanoBinaryWriter writer,
6363
MethodDefinition item)
6464
{
65+
if (!_context.MinimizeComplete)
66+
{
67+
return;
68+
}
69+
6570
WriteStringReference(writer, item.Name);
6671
writer.WriteUInt16(_context.ByteCodeTable.GetMethodRva(item));
6772

source/MetadataProcessor.Core/Tables/nanoMethodReferenceTable.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ protected override void WriteSingleItem(
6868
nanoBinaryWriter writer,
6969
MethodReference item)
7070
{
71+
if (!_context.MinimizeComplete)
72+
{
73+
return;
74+
}
75+
7176
ushort referenceId;
7277
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);
7378

source/MetadataProcessor.Core/Tables/nanoTablesContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ public ushort GetMethodReferenceId(
241241
public nanoResourceFileTable ResourceFileTable { get; private set; }
242242

243243
public static List<string> ClassNamesToExclude { get; private set; }
244+
public bool MinimizeComplete { get; internal set; } = false;
244245

245246
private IEnumerable<Tuple<CustomAttribute, ushort>> GetAttributes(
246247
IEnumerable<ICustomAttributeProvider> types,

source/MetadataProcessor.Core/Tables/nanoTypeDefinitionTable.cs

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -110,34 +110,38 @@ protected override void WriteSingleItem(
110110
{
111111
WriteClassFields(fieldsList, writer.GetMemoryBasedClone(stream));
112112

113-
if (item.DeclaringType == null)
113+
if (_context.MinimizeComplete)
114114
{
115-
foreach (var method in item.Methods)
116-
{
117-
var offsets = CodeWriter
118-
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
119-
.ToList();
120115

121-
_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
116+
if (item.DeclaringType == null)
117+
{
118+
foreach (var method in item.Methods)
119+
{
120+
var offsets = CodeWriter
121+
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
122+
.ToList();
123+
124+
_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
125+
}
122126
}
123-
}
124-
foreach (var nestedType in item.NestedTypes)
125-
{
126-
foreach (var method in nestedType.Methods)
127+
foreach (var nestedType in item.NestedTypes)
127128
{
128-
var offsets = CodeWriter
129-
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
130-
.ToList();
131-
132-
_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
129+
foreach (var method in nestedType.Methods)
130+
{
131+
var offsets = CodeWriter
132+
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
133+
.ToList();
134+
135+
_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
136+
}
133137
}
134-
}
135138

136-
WriteMethodBodies(item.Methods, item.Interfaces, writer);
139+
WriteMethodBodies(item.Methods, item.Interfaces, writer);
137140

138-
_context.SignaturesTable.WriteDataType(item, writer, false, true, true);
141+
_context.SignaturesTable.WriteDataType(item, writer, false, true, true);
139142

140-
writer.WriteBytes(stream.ToArray());
143+
writer.WriteBytes(stream.ToArray());
144+
}
141145
}
142146

143147
writer.WriteUInt16((ushort)GetFlags(item)); // flags

source/MetadataProcessor.Core/Utility/nanoPdbxFileWriter.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Mono.Cecil;
88
using System;
99
using System.Collections.Generic;
10+
using System.Diagnostics;
1011
using System.Globalization;
1112
using System.Linq;
1213
using System.Xml;
@@ -75,13 +76,27 @@ private void WriteClassInfo(
7576
writer.WriteElementString("HasByteCode", "false");
7677
}
7778
writer.WriteStartElement("ILMap");
79+
80+
// sanity check vars
81+
uint prevItem1 = 0;
82+
uint prevItem2 = 0;
83+
7884
foreach (var offset in _context.TypeDefinitionTable.GetByteCodeOffsets(tuple.Item1))
7985
{
86+
if (prevItem1 > 0)
87+
{
88+
// 1st pass, load prevs with current values
89+
Debug.Assert(prevItem1 < offset.Item1);
90+
Debug.Assert(prevItem2 < offset.Item2);
91+
}
8092
writer.WriteStartElement("IL");
8193

8294
writer.WriteElementString("CLR", "0x" + offset.Item1.ToString("X8", CultureInfo.InvariantCulture));
8395
writer.WriteElementString("nanoCLR", "0x" + offset.Item2.ToString("X8", CultureInfo.InvariantCulture));
8496

97+
prevItem1 = offset.Item1;
98+
prevItem2 = offset.Item2;
99+
85100
writer.WriteEndElement();
86101
}
87102
writer.WriteEndElement();

0 commit comments

Comments
 (0)