Skip to content

Commit 36c3bd9

Browse files
authored
Fix signature generator (#38)
1 parent ca5abe9 commit 36c3bd9

File tree

5 files changed

+102
-12
lines changed

5 files changed

+102
-12
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// Copyright (c) 2019 The nanoFramework project contributors
3+
// See LICENSE file in the project root for full license information.
4+
//
5+
6+
using Mono.Cecil;
7+
using System.Text;
8+
using System.Linq;
9+
10+
namespace nanoFramework.Tools.MetadataProcessor.Core.Extensions
11+
{
12+
internal static class ByteArrayExtensions
13+
{
14+
public static string BufferToHexString(this byte[] buffer)
15+
{
16+
StringBuilder output = new StringBuilder();
17+
18+
foreach(byte b in buffer)
19+
{
20+
output.Append(b.ToString("X2"));
21+
}
22+
23+
return output.ToString();
24+
}
25+
}
26+
}

source/MetadataProcessor.Core/MetadataProcessor.Core.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
</ItemGroup>
8282
<ItemGroup>
8383
<Compile Include="Endianness\nanoBinaryWriter.cs" />
84+
<Compile Include="Extensions\ByteArrayExtensions.cs" />
8485
<Compile Include="Extensions\TypeDefinitionExtensions.cs" />
8586
<Compile Include="InanoTable.cs" />
8687
<Compile Include="Mono.Cecil\CodeWriter.cs" />

source/MetadataProcessor.Core/Tables/nanoSignaturesTable.cs

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Mono.Cecil;
88
using Mono.Cecil.Cil;
99
using Mono.Collections.Generic;
10+
using nanoFramework.Tools.MetadataProcessor.Core.Extensions;
1011
using System;
1112
using System.Collections.Generic;
1213
using System.Diagnostics;
@@ -70,7 +71,7 @@ static nanoSignaturesTable()
7071
}
7172

7273
/// <summary>
73-
/// Stores list of unique signatures and corresspoinding identifiers.
74+
/// Stores list of unique signatures and corresponding identifiers.
7475
/// </summary>
7576
private readonly IDictionary<byte[], ushort> _idsBySignatures =
7677
new Dictionary<byte[], ushort>(new ByteArrayComparer());
@@ -80,6 +81,8 @@ static nanoSignaturesTable()
8081
/// </summary>
8182
private readonly nanoTablesContext _context;
8283

84+
private readonly bool _verbose;
85+
8386
/// <summary>
8487
/// Last available signature id (offset in resulting table).
8588
/// </summary>
@@ -91,10 +94,11 @@ static nanoSignaturesTable()
9194
/// <param name="context">
9295
/// Assembly tables context - contains all tables used for building target assembly.
9396
/// </param>
94-
public nanoSignaturesTable(
95-
nanoTablesContext context)
97+
public nanoSignaturesTable(nanoTablesContext context)
9698
{
9799
_context = context;
100+
101+
_verbose = true;
98102
}
99103

100104
/// <summary>
@@ -104,7 +108,12 @@ public nanoSignaturesTable(
104108
public ushort GetOrCreateSignatureId(
105109
MethodDefinition methodDefinition)
106110
{
107-
return GetOrCreateSignatureIdImpl(GetSignature(methodDefinition));
111+
var sig = GetSignature(methodDefinition);
112+
var sigId = GetOrCreateSignatureIdImpl(sig);
113+
114+
if (_verbose) Console.WriteLine($"{methodDefinition.MetadataToken.ToInt32()} -> {sig.BufferToHexString()} -> {sigId.ToString("X4")}");
115+
116+
return sigId;
108117
}
109118

110119
/// <summary>
@@ -114,7 +123,12 @@ public ushort GetOrCreateSignatureId(
114123
public ushort GetOrCreateSignatureId(
115124
FieldDefinition fieldDefinition)
116125
{
117-
return GetOrCreateSignatureIdImpl(GetSignature(fieldDefinition.FieldType, true));
126+
var sig = GetSignature(fieldDefinition.FieldType, true);
127+
var sigId = GetOrCreateSignatureIdImpl(sig);
128+
129+
if (_verbose) Console.WriteLine($"{fieldDefinition.MetadataToken.ToInt32()} -> {sig.BufferToHexString()} -> {sigId.ToString("X4")}");
130+
131+
return sigId;
118132
}
119133

120134
/// <summary>
@@ -124,7 +138,12 @@ public ushort GetOrCreateSignatureId(
124138
public ushort GetOrCreateSignatureId(
125139
FieldReference fieldReference)
126140
{
127-
return GetOrCreateSignatureIdImpl(GetSignature(fieldReference));
141+
var sig = GetSignature(fieldReference);
142+
var sigId = GetOrCreateSignatureIdImpl(sig);
143+
144+
if (_verbose) Console.WriteLine($"{fieldReference.MetadataToken.ToInt32()} -> {sig.BufferToHexString()} -> {sigId.ToString("X4")}");
145+
146+
return sigId;
128147
}
129148

130149
/// <summary>
@@ -134,7 +153,12 @@ public ushort GetOrCreateSignatureId(
134153
public ushort GetOrCreateSignatureId(
135154
MethodReference methodReference)
136155
{
137-
return GetOrCreateSignatureIdImpl(GetSignature(methodReference));
156+
var sig = GetSignature(methodReference);
157+
var sigId = GetOrCreateSignatureIdImpl(sig);
158+
159+
if (_verbose) Console.WriteLine($"{methodReference.MetadataToken.ToInt32()} -> {sig.BufferToHexString()} -> {sigId.ToString("X4")}");
160+
161+
return sigId;
138162
}
139163

140164
/// <summary>
@@ -189,7 +213,12 @@ public ushort GetOrCreateSignatureId(
189213
public ushort GetOrCreateSignatureId(
190214
InterfaceImplementation interfaceImplementation)
191215
{
192-
return GetOrCreateSignatureIdImpl(GetSignature(interfaceImplementation, false));
216+
var sig = GetSignature(interfaceImplementation, false);
217+
var sigId = GetOrCreateSignatureIdImpl(sig);
218+
219+
if (_verbose) Console.WriteLine($"{interfaceImplementation.MetadataToken.ToInt32()} -> {sig.BufferToHexString()} -> {sigId.ToString("X4")}");
220+
221+
return sigId;
193222
}
194223

195224
/// <summary>
@@ -199,7 +228,12 @@ public ushort GetOrCreateSignatureId(
199228
public ushort GetOrCreateSignatureId(
200229
TypeReference typeReference)
201230
{
202-
return GetOrCreateSignatureIdImpl(GetSignature(typeReference, false));
231+
var sig = GetSignature(typeReference, false);
232+
var sigId = GetOrCreateSignatureIdImpl(sig);
233+
234+
if (_verbose) Console.WriteLine($"{typeReference.MetadataToken.ToInt32()} -> {sig.BufferToHexString()} -> {sigId.ToString("X4")}");
235+
236+
return sigId;
203237
}
204238

205239
/// <summary>
@@ -208,7 +242,12 @@ public ushort GetOrCreateSignatureId(
208242
/// <param name="customAttribute">Custom attribute in Mono.Cecil format.</param>
209243
public ushort GetOrCreateSignatureId(CustomAttribute customAttribute)
210244
{
211-
return GetOrCreateSignatureIdImpl(GetSignature(customAttribute));
245+
var sig = GetSignature(customAttribute);
246+
var sigId = GetOrCreateSignatureIdImpl(sig);
247+
248+
if (_verbose) Console.WriteLine($"{customAttribute.ToString()} -> {sig.BufferToHexString()} -> {sigId.ToString("X4")}");
249+
250+
return sigId;
212251
}
213252

214253
/// <summary>
@@ -589,7 +628,7 @@ private void WriteSubTypeInfo(TypeReference typeDefinition, nanoBinaryWriter wri
589628
if (typeDefinition is TypeSpecification &&
590629
_context.TypeSpecificationsTable.TryGetTypeReferenceId(typeDefinition, out referenceId))
591630
{
592-
writer.WriteMetadataToken(((uint)referenceId << 2) | 0x04);
631+
writer.WriteMetadataToken(((uint)referenceId << 2) | 0x02);
593632
}
594633
else if (_context.TypeReferencesTable.TryGetTypeReferenceId(typeDefinition, out referenceId))
595634
{

source/native/Tools.MetaDataProcessor/WatchAssemblyBuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ namespace WatchAssemblyBuilder
252252

253253
HRESULT DumpPdbxToken(CLR_XmlUtil& xml, IXMLDOMNodePtr pNodeParent, mdToken tk);
254254

255+
void DumpSig(CLR_UINT32 token, CLR_UINT16 sig, const BYTE* sigRaw, size_t sigLen);
256+
255257
public:
256258
Linker();
257259
~Linker();

source/native/Tools.Parser/Linker.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,8 @@ HRESULT WatchAssemblyBuilder::Linker::ProcessMemberRef()
10151015
if(!AllocString ( mr.m_name , dst->name, false )) REPORT_NO_MEMORY();
10161016
if(!AllocSignatureForField( &mr.m_sig.m_sigField, dst->sig )) REPORT_NO_MEMORY();
10171017

1018+
DumpSig(tk, dst->sig, m_tmpSig, (int)(m_tmpSigPtr - m_tmpSig));
1019+
10181020
tk2 = m_lookupIDs[ mr.m_tr ]; if(CLR_TypeFromTk(tk2) != TBL_TypeRef) REPORT_NO_MEMORY();
10191021

10201022
dst->container = CLR_DataFromTk( tk2 );
@@ -1029,6 +1031,8 @@ HRESULT WatchAssemblyBuilder::Linker::ProcessMemberRef()
10291031
if(!AllocString ( mr.m_name , dst->name, false )) REPORT_NO_MEMORY();
10301032
if(!AllocSignatureForMethod( &mr.m_sig.m_sigMethod, dst->sig )) REPORT_NO_MEMORY();
10311033

1034+
DumpSig(tk, dst->sig, m_tmpSig, (int)(m_tmpSigPtr - m_tmpSig));
1035+
10321036
tk2 = m_lookupIDs[ mr.m_tr ]; if(CLR_TypeFromTk(tk2) != TBL_TypeRef) REPORT_NO_MEMORY();
10331037

10341038
dst->container = CLR_DataFromTk( tk2 );
@@ -1509,10 +1513,11 @@ HRESULT WatchAssemblyBuilder::Linker::ProcessFieldDef( MetaData::TypeDef& td, CL
15091513

15101514
CLR_RECORD_FIELDDEF* dst = m_tableFieldDef.Alloc( 1 ); if(dst == NULL) REPORT_NO_MEMORY();
15111515

1512-
15131516
if(!AllocString ( fd.m_name , dst->name, false )) REPORT_NO_MEMORY();
15141517
if(!AllocSignatureForField( &fd.m_sig.m_sigField, dst->sig )) REPORT_NO_MEMORY();
15151518

1519+
DumpSig(fd.m_fd, dst->sig, m_tmpSig, (int)(m_tmpSigPtr - m_tmpSig));
1520+
15161521
switch(fd.m_flags & fdFieldAccessMask)
15171522
{
15181523
case fdPrivateScope: dst->flags = CLR_RECORD_FIELDDEF::FD_Scope_PrivateScope; break;
@@ -1695,6 +1700,8 @@ HRESULT WatchAssemblyBuilder::Linker::ProcessMethodDef( MetaData::TypeDef& td, C
16951700
if(!AllocString ( md.m_name , dst->name , false )) REPORT_NO_MEMORY();
16961701
if(!AllocSignatureForMethod( &md.m_method, dst->sig )) REPORT_NO_MEMORY();
16971702

1703+
DumpSig(md.m_md, dst->sig, m_tmpSig, (int)(m_tmpSigPtr - m_tmpSig));
1704+
16981705
NANOCLR_CHECK_HRESULT(CheckRange( md.m_method.m_lstParams, dst->numArgs, L"number", L"arguments" ));
16991706

17001707
dst->numArgs = (CLR_UINT8) md.m_method.m_lstParams.size() ; if((md.m_flags & mdStatic) == 0) dst->numArgs++; // Include the 'this' pointer in the number of arguments.
@@ -1725,6 +1732,21 @@ HRESULT WatchAssemblyBuilder::Linker::ProcessMethodDef( MetaData::TypeDef& td, C
17251732
NANOCLR_CLEANUP_END();
17261733
}
17271734

1735+
void WatchAssemblyBuilder::Linker::DumpSig(CLR_UINT32 token, CLR_UINT16 sig, const BYTE* sigRaw, size_t sigLen)
1736+
{
1737+
printf("%d -> ", token);
1738+
1739+
const BYTE* sigCopy = sigRaw;
1740+
size_t sigLenCopy = sigLen;
1741+
1742+
while (sigLenCopy-- > 0)
1743+
{
1744+
printf("%02X", *sigCopy++);
1745+
}
1746+
1747+
printf(" -> %04X\n", sig);
1748+
}
1749+
17281750
//--//
17291751

17301752
HRESULT WatchAssemblyBuilder::Linker::ProcessMethodDef_ByteCode( MetaData::TypeDef& td, CLR_RECORD_TYPEDEF* tdDst, MetaData::MethodDef& md, CLR_UINT32 mode )

0 commit comments

Comments
 (0)