@@ -108,6 +108,10 @@ static nanoSignaturesTable()
108108 /// </summary>
109109 private readonly IDictionary < byte [ ] , ushort > _idsBySignatures =
110110 new Dictionary < byte [ ] , ushort > ( new ByteArrayComparer ( ) ) ;
111+ /// <summary>
112+ /// The signatures as they are written to the output stream.
113+ /// </summary>
114+ private readonly List < byte > _signatureTable = new List < byte > ( ) ;
111115
112116 /// <summary>
113117 /// Assembly tables context - contains all tables used for building target assembly.
@@ -116,11 +120,6 @@ static nanoSignaturesTable()
116120
117121 private readonly bool _verbose = false ;
118122
119- /// <summary>
120- /// Last available signature id (offset in resulting table).
121- /// </summary>
122- private ushort _lastAvailableId ;
123-
124123 /// <summary>
125124 /// Creates new instance of <see cref="nanoSignaturesTable"/> object.
126125 /// </summary>
@@ -468,12 +467,7 @@ public void WriteDataTypeForTypeDef(TypeDefinition typeDefinition, nanoBinaryWri
468467 public void Write (
469468 nanoBinaryWriter writer )
470469 {
471- foreach ( var signature in _idsBySignatures
472- . OrderBy ( item => item . Value )
473- . Select ( item => item . Key ) )
474- {
475- writer . WriteBytes ( signature ) ;
476- }
470+ writer . WriteBytes ( _signatureTable . ToArray ( ) ) ;
477471 }
478472
479473 private byte [ ] GetSignature (
@@ -736,18 +730,29 @@ private ushort GetOrCreateSignatureIdImpl(
736730 return id ;
737731 }
738732
739- var fullSignatures = GetFullSignaturesArray ( ) ;
740- for ( var i = 0 ; i <= fullSignatures . Length - signature . Length ; ++ i )
733+ for ( int i = 0 ; i < _signatureTable . Count - signature . Length ; i ++ )
741734 {
742- if ( signature . SequenceEqual ( fullSignatures . Skip ( i ) . Take ( signature . Length ) ) )
735+ bool found = true ;
736+ for ( int j = 0 ; j < signature . Length ; ++ j )
743737 {
744- return ( ushort ) i ;
738+ if ( _signatureTable [ i + j ] != signature [ j ] )
739+ {
740+ found = false ;
741+ break ;
742+ }
743+ }
744+
745+ if ( found )
746+ {
747+ id = ( ushort ) i ;
748+ _idsBySignatures . Add ( signature , id ) ;
749+ return id ;
745750 }
746751 }
747752
748- id = _lastAvailableId ;
753+ id = ( ushort ) _signatureTable . Count ;
749754 _idsBySignatures . Add ( signature , id ) ;
750- _lastAvailableId += ( ushort ) signature . Length ;
755+ _signatureTable . AddRange ( signature ) ;
751756
752757 return id ;
753758 }
@@ -775,20 +780,6 @@ private void WriteTypeInfo(
775780 }
776781 }
777782
778- private byte [ ] GetFullSignaturesArray ( )
779- {
780- return _idsBySignatures
781- . OrderBy ( item => item . Value )
782- . Select ( item => item . Key )
783- . Aggregate ( new List < byte > ( ) ,
784- ( current , item ) =>
785- {
786- current . AddRange ( item ) ;
787- return current ;
788- } )
789- . ToArray ( ) ;
790- }
791-
792783 private void WriteSubTypeInfo ( TypeReference typeDefinition , nanoBinaryWriter writer )
793784 {
794785 ushort referenceId ;
0 commit comments