Skip to content

Commit 98b12ea

Browse files
authored
Add processing of field ref and method ref to support generics (#127)
1 parent 0305894 commit 98b12ea

File tree

3 files changed

+115
-10
lines changed

3 files changed

+115
-10
lines changed

MetadataProcessor.Core/Tables/nanoFieldReferenceTable.cs

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,57 @@ protected override void WriteSingleItem(
7373
return;
7474
}
7575

76+
bool experimentalCode = true;
77+
7678
ushort referenceId;
77-
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);
7879

79-
WriteStringReference(writer, item.Name);
80-
writer.WriteUInt16(referenceId);
8180

82-
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
83-
writer.WriteUInt16(0); // padding
81+
if (experimentalCode)
82+
{
83+
////////////////////////////////////
84+
// EXPERIMENTAL CODE FOR GENERICS //
85+
////////////////////////////////////
86+
87+
if (_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId))
88+
{
89+
WriteStringReference(writer, item.Name);
90+
writer.WriteUInt16(referenceId);
91+
92+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
93+
writer.WriteUInt16(0); // padding
94+
}
95+
else if (_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType.Resolve(), out referenceId))
96+
{
97+
WriteStringReference(writer, item.Name);
98+
writer.WriteUInt16(referenceId);
99+
100+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
101+
writer.WriteUInt16(0); // padding
102+
}
103+
else if (_context.TypeDefinitionTable.TryGetTypeReferenceId(item.DeclaringType.Resolve(), out referenceId))
104+
{
105+
WriteStringReference(writer, item.Name);
106+
writer.WriteUInt16((ushort)(referenceId | 0x8000));
107+
108+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
109+
writer.WriteUInt16(0); // padding
110+
}
111+
else
112+
{
113+
throw new ArgumentException($"Can't find entry in type reference table for {item.DeclaringType.FullName} for Field {item.FullName}.");
114+
}
115+
}
116+
else
117+
{
118+
119+
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);
120+
121+
WriteStringReference(writer, item.Name);
122+
writer.WriteUInt16(referenceId);
123+
124+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
125+
writer.WriteUInt16(0); // padding
126+
}
84127
}
85128
}
86129
}

MetadataProcessor.Core/Tables/nanoMethodReferenceTable.cs

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,56 @@ protected override void WriteSingleItem(
7373
return;
7474
}
7575

76+
bool experimentalCode = true;
77+
7678
ushort referenceId;
77-
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);
7879

79-
WriteStringReference(writer, item.Name);
80-
writer.WriteUInt16(referenceId);
8180

82-
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
83-
writer.WriteUInt16(0); // padding
81+
if (experimentalCode)
82+
{
83+
////////////////////////////////////
84+
// EXPERIMENTAL CODE FOR GENERICS //
85+
////////////////////////////////////
86+
87+
if (_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId))
88+
{
89+
WriteStringReference(writer, item.Name);
90+
writer.WriteUInt16(referenceId);
91+
92+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
93+
writer.WriteUInt16(0); // padding
94+
}
95+
else if (_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType.Resolve(), out referenceId))
96+
{
97+
WriteStringReference(writer, item.Name);
98+
writer.WriteUInt16((ushort)(referenceId | 0x8000));
99+
100+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
101+
writer.WriteUInt16(0); // padding
102+
}
103+
else if (_context.TypeDefinitionTable.TryGetTypeReferenceId(item.DeclaringType.Resolve(), out referenceId))
104+
{
105+
WriteStringReference(writer, item.Name);
106+
writer.WriteUInt16((ushort)(referenceId | 0x8000));
107+
108+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
109+
writer.WriteUInt16(0); // padding
110+
}
111+
else
112+
{
113+
throw new ArgumentException($"Can't find entry in type reference table for {item.DeclaringType.FullName} for Method {item.FullName}.");
114+
}
115+
}
116+
else
117+
{
118+
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);
119+
120+
WriteStringReference(writer, item.Name);
121+
writer.WriteUInt16(referenceId);
122+
123+
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));
124+
writer.WriteUInt16(0); // padding
125+
}
84126
}
85127
}
86128
}

MetadataProcessor.Core/nanoAssemblyBuilder.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,11 @@ private HashSet<MetadataToken> BuildDependencyList(MetadataToken token)
418418
{
419419
set.Add(p.ParameterType.MetadataToken);
420420
}
421+
if (p.ParameterType is GenericInstanceType)
422+
{
423+
set.Add(p.ParameterType.MetadataToken);
424+
set.Add(p.ParameterType.GetElementType().MetadataToken);
425+
}
421426
}
422427
}
423428

@@ -557,6 +562,11 @@ private HashSet<MetadataToken> BuildDependencyList(MetadataToken token)
557562
{
558563
set.Add(fd.FieldType.MetadataToken);
559564
}
565+
else if (fd.FieldType is GenericInstanceType)
566+
{
567+
set.Add(fd.FieldType.MetadataToken);
568+
set.Add(fd.FieldType.GetElementType().MetadataToken);
569+
}
560570
else if (fd.FieldType.IsArray)
561571
{
562572
if (fd.FieldType.DeclaringType != null)
@@ -680,6 +690,11 @@ private HashSet<MetadataToken> BuildDependencyList(MetadataToken token)
680690
{
681691
set.Add(parameterType.MetadataToken);
682692
}
693+
else if(parameterType is GenericInstanceType)
694+
{
695+
set.Add(parameterType.MetadataToken);
696+
set.Add(parameterType.GetElementType().MetadataToken);
697+
}
683698
else if (!parameterType.IsValueType &&
684699
!parameterType.IsPrimitive &&
685700
parameterType.FullName != "System.Void" &&
@@ -718,6 +733,11 @@ private HashSet<MetadataToken> BuildDependencyList(MetadataToken token)
718733
{
719734
set.Add(v.VariableType.MetadataToken);
720735
}
736+
else if (v.VariableType is GenericInstanceType)
737+
{
738+
set.Add(v.VariableType.MetadataToken);
739+
set.Add(v.VariableType.GetElementType().MetadataToken);
740+
}
721741
}
722742

723743
// op codes

0 commit comments

Comments
 (0)