Skip to content

Commit d2e0964

Browse files
committed
Fixes and improvements on signature generation
Signed-off-by: José Simões <[email protected]>
1 parent 7edf0d0 commit d2e0964

File tree

3 files changed

+59
-37
lines changed

3 files changed

+59
-37
lines changed

source/MetadataProcessor.Core/Tables/nanoMethodDefinitionTable.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ protected override void WriteSingleItem(
7373
++parametersCount; // add implicit 'this' pointer into non-static methods
7474
}
7575

76-
_context.SignaturesTable.WriteDataType(item.ReturnType, writer, false, false);
76+
_context.SignaturesTable.WriteDataType(item.ReturnType, writer, false, false, false);
7777
if (item.ReturnType is TypeSpecification)
7878
{
7979
// developer note

source/MetadataProcessor.Core/Tables/nanoSignaturesTable.cs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,17 @@ public void WriteDataType(
222222
TypeReference typeDefinition,
223223
nanoBinaryWriter writer,
224224
bool alsoWriteSubType,
225-
bool expandEnumType)
225+
bool expandEnumType,
226+
bool isTypeDefinition)
226227
{
227-
nanoCLR_DataType dataType;
228-
if (PrimitiveTypes.TryGetValue(typeDefinition.FullName, out dataType))
228+
if (!isTypeDefinition)
229229
{
230-
writer.WriteByte((byte)dataType);
231-
return;
230+
nanoCLR_DataType dataType;
231+
if (PrimitiveTypes.TryGetValue(typeDefinition.FullName, out dataType))
232+
{
233+
writer.WriteByte((byte)dataType);
234+
return;
235+
}
232236
}
233237

234238
if (typeDefinition is TypeSpecification)
@@ -274,11 +278,17 @@ public void WriteDataType(
274278
if (alsoWriteSubType)
275279
{
276280
var array = (ArrayType)typeDefinition;
277-
WriteDataType(array.ElementType, writer, true, expandEnumType);
281+
WriteDataType(array.ElementType, writer, true, expandEnumType, isTypeDefinition);
278282
}
279283
return;
280284
}
281285

286+
if(typeDefinition.MetadataType == MetadataType.Object)
287+
{
288+
writer.WriteByte((byte)nanoCLR_DataType.DATATYPE_CLASS);
289+
return;
290+
}
291+
282292
writer.WriteByte(0x00);
283293
}
284294

@@ -375,6 +385,10 @@ private byte[] GetSignature(
375385

376386
if (isFieldSignature)
377387
{
388+
//////////////////////////////////////////////////////////
389+
// dev notes: this is coming from
390+
// CorCallingConvention.IMAGE_CEE_CS_CALLCONV_FIELD = 0x06
391+
//////////////////////////////////////////////////////////
378392
writer.Write((byte)0x06); // Field signature prefix
379393
}
380394
WriteTypeInfo(typeReference, binaryWriter);
@@ -538,20 +552,22 @@ private void WriteTypeInfo(
538552
TypeReference typeReference,
539553
nanoBinaryWriter writer)
540554
{
555+
// dev notes: from the original MDP
556+
// If there is modifier on type record of local variable, we put it before type of local variable.
541557
if (typeReference.IsOptionalModifier)
542558
{
543-
writer.WriteByte(0); // OpTypeModifier ???
559+
writer.WriteByte(0x0); // OpTypeModifier ???
544560
}
545561

546562
var byReference = typeReference as ByReferenceType;
547563
if (byReference != null)
548564
{
549565
writer.WriteByte((byte)nanoCLR_DataType.DATATYPE_BYREF);
550-
WriteDataType(byReference.ElementType, writer, true, false);
566+
WriteDataType(byReference.ElementType, writer, true, false, false);
551567
}
552568
else
553569
{
554-
WriteDataType(typeReference, writer, true, false);
570+
WriteDataType(typeReference, writer, true, false, false);
555571
}
556572
}
557573

source/MetadataProcessor.Core/Tables/nanoTypeDefinitionTable.cs

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,6 @@ protected override void WriteSingleItem(
105105
.Where(field => !field.HasConstant)
106106
.OrderByDescending(field => field.IsStatic)
107107
.ToList();
108-
foreach (var field in fieldsList)
109-
{
110-
_context.SignaturesTable.GetOrCreateSignatureId(field);
111-
_context.SignaturesTable.GetOrCreateSignatureId(field.InitialValue);
112-
}
113108

114109
using (var stream = new MemoryStream(6))
115110
{
@@ -140,7 +135,7 @@ protected override void WriteSingleItem(
140135

141136
WriteMethodBodies(item.Methods, item.Interfaces, writer);
142137

143-
_context.SignaturesTable.WriteDataType(item, writer, false, true);
138+
_context.SignaturesTable.WriteDataType(item, writer, false, true, true);
144139

145140
writer.WriteBytes(stream.ToArray());
146141
}
@@ -154,45 +149,56 @@ private void WriteClassFields(
154149
{
155150
ushort firstStaticFieldId = 0;
156151
var staticFieldsCount = 0;
157-
foreach (var field in fieldsList.Where(item => item.IsStatic && !item.IsLiteral))
152+
foreach (var field in fieldsList.Where(item => item.IsStatic))
158153
{
159154
ushort fieldReferenceId;
160-
_context.FieldsTable.TryGetFieldReferenceId(field, true, out fieldReferenceId);
161-
162-
if (staticFieldsCount == 0)
155+
if (_context.FieldsTable.TryGetFieldReferenceId(field, false, out fieldReferenceId))
163156
{
164-
// this is to be checked only on the 1st pass
165-
firstStaticFieldId = Math.Min(_context.FieldsTable.MaxFieldId, fieldReferenceId);
166-
}
157+
if (staticFieldsCount == 0)
158+
{
159+
// this is to be checked only on the 1st pass
160+
firstStaticFieldId = fieldReferenceId;
161+
}
167162

168-
_context.SignaturesTable.GetOrCreateSignatureId(field);
169-
_context.StringTable.GetOrCreateStringId(field.Name);
163+
_context.SignaturesTable.GetOrCreateSignatureId(field);
164+
_context.SignaturesTable.GetOrCreateSignatureId(field.InitialValue);
165+
_context.StringTable.GetOrCreateStringId(field.Name);
170166

171-
++staticFieldsCount;
167+
++staticFieldsCount;
168+
}
169+
else
170+
{
171+
// field ID not found!!
172+
}
172173
}
173174

174175
ushort firstInstanceFieldId = 0;
175176
var instanceFieldsCount = 0;
176-
foreach (var field in fieldsList.Where(item => !item.IsStatic && !item.IsLiteral))
177+
foreach (var field in fieldsList.Where(item => !item.IsStatic))
177178
{
178179
ushort fieldReferenceId;
179-
_context.FieldsTable.TryGetFieldReferenceId(field, true, out fieldReferenceId);
180-
181-
if (instanceFieldsCount == 0)
180+
if (_context.FieldsTable.TryGetFieldReferenceId(field, false, out fieldReferenceId))
182181
{
183-
// this is to be checked only on the 1st pass
184-
firstInstanceFieldId = Math.Min(_context.FieldsTable.MaxFieldId, fieldReferenceId);
185-
}
182+
if (instanceFieldsCount == 0)
183+
{
184+
// this is to be checked only on the 1st pass
185+
firstInstanceFieldId = fieldReferenceId;
186+
}
186187

187-
_context.SignaturesTable.GetOrCreateSignatureId(field);
188-
_context.StringTable.GetOrCreateStringId(field.Name);
188+
_context.SignaturesTable.GetOrCreateSignatureId(field);
189+
_context.StringTable.GetOrCreateStringId(field.Name);
189190

190-
++instanceFieldsCount;
191+
++instanceFieldsCount;
192+
}
193+
else
194+
{
195+
// field ID not found!!
196+
}
191197
}
192198

193199
if (firstStaticFieldId < firstInstanceFieldId)
194200
{
195-
if (instanceFieldsCount > 0 && staticFieldsCount > 0)
201+
if (instanceFieldsCount > 0 && staticFieldsCount == 0)
196202
{
197203
firstStaticFieldId = firstInstanceFieldId;
198204
}

0 commit comments

Comments
 (0)