Skip to content

Commit 254fc5e

Browse files
authored
Fix field definition output (#36)
1 parent 8095690 commit 254fc5e

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

source/MetadataProcessor.Core/Tables/nanoFieldDefinitionTable.cs

Lines changed: 9 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.Linq;
1011

1112
namespace nanoFramework.Tools.MetadataProcessor
1213
{
@@ -185,5 +186,13 @@ private ushort GetFlags(
185186

186187
return flag;
187188
}
189+
190+
public override void RemoveUnusedItems(HashSet<MetadataToken> set)
191+
{
192+
base.RemoveUnusedItems(set);
193+
194+
// adjust ID
195+
_maxReferenceId = _items.Count();
196+
}
188197
}
189198
}

source/MetadataProcessor.Core/Tables/nanoReferenceTableBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ protected abstract void WriteSingleItem(
153153
/// <summary>
154154
/// Remove unused items from table.
155155
/// </summary>
156-
public void RemoveUnusedItems(HashSet<MetadataToken> set)
156+
public virtual void RemoveUnusedItems(HashSet<MetadataToken> set)
157157
{
158158
// build a collection of the current items that are present in the used items set
159159
List<T> usedItems = new List<T>();

source/MetadataProcessor.Core/Tables/nanoTypeDefinitionTable.cs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public int GetHashCode(TypeDefinition item)
4242
private IDictionary<uint, List<Tuple<uint, uint>>> _byteCodeOffsets =
4343
new Dictionary<uint, List<Tuple<uint, uint>>>();
4444

45-
public List<TypeDefinition> TypeDefinitions { get; }
45+
public List<TypeDefinition> TypeDefinitions { get; private set; }
4646

4747
/// <summary>
4848
/// Creates new instance of <see cref="nanoTypeDefinitionTable"/> object.
@@ -158,7 +158,12 @@ private void WriteClassFields(
158158
{
159159
ushort fieldReferenceId;
160160
_context.FieldsTable.TryGetFieldReferenceId(field, true, out fieldReferenceId);
161-
firstStaticFieldId = Math.Min(_context.FieldsTable.MaxFieldId, fieldReferenceId);
161+
162+
if (staticFieldsCount == 0)
163+
{
164+
// this is to be checked only on the 1st pass
165+
firstStaticFieldId = Math.Min(_context.FieldsTable.MaxFieldId, fieldReferenceId);
166+
}
162167

163168
_context.SignaturesTable.GetOrCreateSignatureId(field);
164169
_context.StringTable.GetOrCreateStringId(field.Name);
@@ -172,7 +177,12 @@ private void WriteClassFields(
172177
{
173178
ushort fieldReferenceId;
174179
_context.FieldsTable.TryGetFieldReferenceId(field, true, out fieldReferenceId);
175-
firstInstanceFieldId = Math.Min(_context.FieldsTable.MaxFieldId, fieldReferenceId);
180+
181+
if (instanceFieldsCount == 0)
182+
{
183+
// this is to be checked only on the 1st pass
184+
firstInstanceFieldId = Math.Min(_context.FieldsTable.MaxFieldId, fieldReferenceId);
185+
}
176186

177187
_context.SignaturesTable.GetOrCreateSignatureId(field);
178188
_context.StringTable.GetOrCreateStringId(field.Name);
@@ -371,5 +381,23 @@ internal void ResetByteCodeOffsets()
371381
{
372382
_byteCodeOffsets = new Dictionary<uint, List<Tuple<uint, uint>>>();
373383
}
384+
385+
public override void RemoveUnusedItems(HashSet<MetadataToken> set)
386+
{
387+
base.RemoveUnusedItems(set);
388+
389+
// remove
390+
// build a collection of the current items that are present in the used items set
391+
List<TypeDefinition> usedItems = new List<TypeDefinition>();
392+
393+
foreach (var item in TypeDefinitions
394+
.Where(item => set.Contains(item.MetadataToken)))
395+
{
396+
usedItems.Add(item);
397+
}
398+
399+
// replace existing collection
400+
TypeDefinitions = usedItems;
401+
}
374402
}
375403
}

0 commit comments

Comments
 (0)