1
- using System ;
1
+ using System ;
2
2
using System . Collections . Generic ;
3
3
using Mono . Cecil ;
4
4
@@ -85,50 +85,68 @@ protected override void WriteSingleItem(
85
85
writer . WriteByte ( CodeWriter . CalculateStackSize ( item . Body ) ) ;
86
86
87
87
var methodSignature = _context . SignaturesTable . GetOrCreateSignatureId ( item ) ;
88
- writer . WriteUInt16 ( item . HasBody ?
89
- _context . SignaturesTable . GetOrCreateSignatureId ( item . Body . Variables ) :
90
- ( item . IsAbstract || item . IsRuntime ? ( ushort ) 0x0000 : ( ushort ) 0xFFFF ) ) ;
88
+
89
+ // locals signature
90
+ if ( item . HasBody )
91
+ {
92
+ writer . WriteUInt16 ( _context . SignaturesTable . GetOrCreateSignatureId ( item . Body . Variables ) ) ;
93
+ }
94
+ else
95
+ {
96
+ if ( item . IsAbstract ||
97
+ item . IsRuntime ||
98
+ item . IsInternalCall )
99
+ {
100
+ writer . WriteUInt16 ( 0x0000 ) ;
101
+ }
102
+ else
103
+ {
104
+ writer . WriteUInt16 ( 0xFFFF ) ;
105
+ }
106
+ }
107
+
91
108
writer . WriteUInt16 ( methodSignature ) ;
92
109
}
93
110
94
111
private uint GetFlags (
95
112
MethodDefinition method )
96
113
{
97
- const uint MD_Scope_Private = 0x00000001 ; // Accessible only by the parent type.
98
- const uint MD_Scope_FamANDAssem = 0x00000002 ; // Accessible by sub-types only in this Assembly.
99
- const uint MD_Scope_Assem = 0x00000003 ; // Accessibly by anyone in the Assembly.
100
- const uint MD_Scope_Family = 0x00000004 ; // Accessible only by type and sub-types.
101
- const uint MD_Scope_FamORAssem = 0x00000005 ; // Accessibly by sub-types anywhere, plus anyone in assembly.
102
- const uint MD_Scope_Public = 0x00000006 ; // Accessibly by anyone who has visibility to this scope.
103
-
104
- const uint MD_Static = 0x00000010 ; // Defined on type, else per instance.
105
- const uint MD_Final = 0x00000020 ; // Method may not be overridden.
106
- const uint MD_Virtual = 0x00000040 ; // Method virtual.
107
- const uint MD_HideBySig = 0x00000080 ; // Method hides by name+sig, else just by name.
108
-
109
- const uint MD_ReuseSlot = 0x00000000 ; // The default.
110
- const uint MD_NewSlot = 0x00000100 ; // Method always gets a new slot in the vtable.
111
- const uint MD_Abstract = 0x00000200 ; // Method does not provide an implementation.
112
- const uint MD_SpecialName = 0x00000400 ; // Method is special. Name describes how.
113
- const uint MD_NativeProfiled = 0x00000800 ;
114
-
115
- const uint MD_Constructor = 0x00001000 ;
116
- const uint MD_StaticConstructor = 0x00002000 ;
117
- const uint MD_Finalizer = 0x00004000 ;
118
-
119
- const uint MD_DelegateConstructor = 0x00010000 ;
120
- const uint MD_DelegateInvoke = 0x00020000 ;
121
- const uint MD_DelegateBeginInvoke = 0x00040000 ;
122
- const uint MD_DelegateEndInvoke = 0x00080000 ;
123
-
124
- const uint MD_Synchronized = 0x01000000 ;
125
- const uint MD_GloballySynchronized = 0x02000000 ;
126
- const uint MD_Patched = 0x04000000 ;
127
- const uint MD_EntryPoint = 0x08000000 ;
128
- const uint MD_RequireSecObject = 0x10000000 ; // Method calls another method containing security code.
129
- const uint MD_HasSecurity = 0x20000000 ; // Method has security associate with it.
130
- const uint MD_HasExceptionHandlers = 0x40000000 ;
131
- const uint MD_HasAttributes = 0x80000000 ;
114
+ const uint MD_Scope_Private = 0x00000001 ; // Accessible only by the parent type.
115
+ const uint MD_Scope_FamANDAssem = 0x00000002 ; // Accessible by sub-types only in this Assembly.
116
+ const uint MD_Scope_Assem = 0x00000003 ; // Accessibly by anyone in the Assembly.
117
+ const uint MD_Scope_Family = 0x00000004 ; // Accessible only by type and sub-types.
118
+ const uint MD_Scope_FamORAssem = 0x00000005 ; // Accessibly by sub-types anywhere, plus anyone in assembly.
119
+ const uint MD_Scope_Public = 0x00000006 ; // Accessibly by anyone who has visibility to this scope.
120
+
121
+ const uint MD_Static = 0x00000010 ; // Defined on type, else per instance.
122
+ const uint MD_Final = 0x00000020 ; // Method may not be overridden.
123
+ const uint MD_Virtual = 0x00000040 ; // Method virtual.
124
+ const uint MD_HideBySig = 0x00000080 ; // Method hides by name+sig, else just by name.
125
+
126
+ const uint MD_ReuseSlot = 0x00000000 ; // The default.
127
+ const uint MD_NewSlot = 0x00000100 ; // Method always gets a new slot in the vtable.
128
+ const uint MD_Abstract = 0x00000200 ; // Method does not provide an implementation.
129
+ const uint MD_SpecialName = 0x00000400 ; // Method is special. Name describes how.
130
+ const uint MD_NativeProfiled = 0x00000800 ;
131
+
132
+ const uint MD_Constructor = 0x00001000 ;
133
+ const uint MD_StaticConstructor = 0x00002000 ;
134
+ const uint MD_Finalizer = 0x00004000 ;
135
+
136
+ const uint MD_DelegateConstructor = 0x00010000 ;
137
+ const uint MD_DelegateInvoke = 0x00020000 ;
138
+ const uint MD_DelegateBeginInvoke = 0x00040000 ;
139
+ const uint MD_DelegateEndInvoke = 0x00080000 ;
140
+
141
+ const uint MD_Synchronized = 0x01000000 ;
142
+ const uint MD_GloballySynchronized = 0x02000000 ;
143
+ const uint MD_Patched = 0x04000000 ;
144
+ const uint MD_EntryPoint = 0x08000000 ;
145
+
146
+ const uint MD_RequireSecObject = 0x10000000 ; // Method calls another method containing security code.
147
+ const uint MD_HasSecurity = 0x20000000 ; // Method has security associate with it.
148
+ const uint MD_HasExceptionHandlers = 0x40000000 ;
149
+ const uint MD_HasAttributes = 0x80000000 ;
132
150
133
151
uint flag = 0 ;
134
152
if ( method . IsPrivate )
@@ -189,9 +207,11 @@ private uint GetFlags(
189
207
{
190
208
flag |= MD_SpecialName ;
191
209
}
210
+
192
211
if ( method . IsNative )
193
212
{
194
- flag |= MD_NativeProfiled ; // ???
213
+ // can't find anything relevant to do with this...
214
+ // flag |= MD_NativeProfiled; // ???
195
215
}
196
216
197
217
if ( method . IsConstructor )
@@ -205,7 +225,9 @@ private uint GetFlags(
205
225
}
206
226
if ( method . HasCustomAttributes )
207
227
{
208
- flag |= MD_HasAttributes ; // ???
228
+ // TODO
229
+ // parse special attributes: NativeProfiler, GloballySynchronized
230
+ //flag |= MD_HasAttributes; // ???
209
231
}
210
232
211
233
if ( method == method . Module . EntryPoint )
@@ -238,6 +260,18 @@ private uint GetFlags(
238
260
flag |= MD_DelegateEndInvoke ;
239
261
}
240
262
}
263
+
264
+ var methodName = method . Name ;
265
+ if ( methodName == "Finalize" &&
266
+ method . ReturnType . FullName == "System.Void" &&
267
+ ! method . HasParameters )
268
+ {
269
+ flag |= MD_Finalizer ;
270
+
271
+ // TODO
272
+ // missing setting tdDst->flags |= CLR_RECORD_TYPEDEF::TD_HasFinalizer;
273
+ }
274
+
241
275
return flag ;
242
276
}
243
277
}
0 commit comments