13
13
14
14
internal sealed class PInvokeTableGenerator
15
15
{
16
- private static readonly char [ ] s_charsToReplace = new [ ] { '.' , '-' , '+' } ;
17
16
private readonly Dictionary < Assembly , bool > _assemblyDisableRuntimeMarshallingAttributeCache = new ( ) ;
18
17
19
18
private TaskLoggingHelper Log { get ; set ; }
19
+ private readonly Func < string , string > _fixupSymbolName ;
20
20
21
- public PInvokeTableGenerator ( TaskLoggingHelper log ) => Log = log ;
21
+ public PInvokeTableGenerator ( Func < string , string > fixupSymbolName , TaskLoggingHelper log )
22
+ {
23
+ Log = log ;
24
+ _fixupSymbolName = fixupSymbolName ;
25
+ }
22
26
23
27
public IEnumerable < string > Generate ( string [ ] pinvokeModules , string [ ] assemblies , string outputPath )
24
28
{
@@ -234,14 +238,14 @@ private void EmitPInvokeTable(StreamWriter w, Dictionary<string, string> modules
234
238
235
239
foreach ( var module in modules . Keys )
236
240
{
237
- string symbol = ModuleNameToId ( module ) + "_imports" ;
241
+ string symbol = _fixupSymbolName ( module ) + "_imports" ;
238
242
w . WriteLine ( "static PinvokeImport " + symbol + " [] = {" ) ;
239
243
240
244
var assemblies_pinvokes = pinvokes .
241
245
Where ( l => l . Module == module && ! l . Skip ) .
242
246
OrderBy ( l => l . EntryPoint ) .
243
247
GroupBy ( d => d . EntryPoint ) .
244
- Select ( l => "{\" " + FixupSymbolName ( l . Key ) + "\" , " + FixupSymbolName ( l . Key ) + "}, " +
248
+ Select ( l => "{\" " + _fixupSymbolName ( l . Key ) + "\" , " + _fixupSymbolName ( l . Key ) + "}, " +
245
249
"// " + string . Join ( ", " , l . Select ( c => c . Method . DeclaringType ! . Module ! . Assembly ! . GetName ( ) ! . Name ! ) . Distinct ( ) . OrderBy ( n => n ) ) ) ;
246
250
247
251
foreach ( var pinvoke in assemblies_pinvokes )
@@ -255,7 +259,7 @@ private void EmitPInvokeTable(StreamWriter w, Dictionary<string, string> modules
255
259
w . Write ( "static void *pinvoke_tables[] = { " ) ;
256
260
foreach ( var module in modules . Keys )
257
261
{
258
- string symbol = ModuleNameToId ( module ) + "_imports" ;
262
+ string symbol = _fixupSymbolName ( module ) + "_imports" ;
259
263
w . Write ( symbol + "," ) ;
260
264
}
261
265
w . WriteLine ( "};" ) ;
@@ -266,18 +270,6 @@ private void EmitPInvokeTable(StreamWriter w, Dictionary<string, string> modules
266
270
}
267
271
w . WriteLine ( "};" ) ;
268
272
269
- static string ModuleNameToId ( string name )
270
- {
271
- if ( name . IndexOfAny ( s_charsToReplace ) < 0 )
272
- return name ;
273
-
274
- string fixedName = name ;
275
- foreach ( char c in s_charsToReplace )
276
- fixedName = fixedName . Replace ( c , '_' ) ;
277
-
278
- return fixedName ;
279
- }
280
-
281
273
static bool ShouldTreatAsVariadic ( PInvoke [ ] candidates )
282
274
{
283
275
if ( candidates . Length < 2 )
@@ -295,43 +287,15 @@ static bool ShouldTreatAsVariadic(PInvoke[] candidates)
295
287
}
296
288
}
297
289
298
- private static string FixupSymbolName ( string name )
299
- {
300
- UTF8Encoding utf8 = new ( ) ;
301
- byte [ ] bytes = utf8 . GetBytes ( name ) ;
302
- StringBuilder sb = new ( ) ;
303
-
304
- foreach ( byte b in bytes )
305
- {
306
- if ( ( b >= ( byte ) '0' && b <= ( byte ) '9' ) ||
307
- ( b >= ( byte ) 'a' && b <= ( byte ) 'z' ) ||
308
- ( b >= ( byte ) 'A' && b <= ( byte ) 'Z' ) ||
309
- ( b == ( byte ) '_' ) )
310
- {
311
- sb . Append ( ( char ) b ) ;
312
- }
313
- else if ( s_charsToReplace . Contains ( ( char ) b ) )
314
- {
315
- sb . Append ( '_' ) ;
316
- }
317
- else
318
- {
319
- sb . Append ( $ "_{ b : X} _") ;
320
- }
321
- }
322
-
323
- return sb . ToString ( ) ;
324
- }
325
-
326
- private static string SymbolNameForMethod ( MethodInfo method )
290
+ private string SymbolNameForMethod ( MethodInfo method )
327
291
{
328
292
StringBuilder sb = new ( ) ;
329
293
Type ? type = method . DeclaringType ;
330
294
sb . Append ( $ "{ type ! . Module ! . Assembly ! . GetName ( ) ! . Name ! } _") ;
331
295
sb . Append ( $ "{ ( type ! . IsNested ? type ! . FullName : type ! . Name ) } _") ;
332
296
sb . Append ( method . Name ) ;
333
297
334
- return FixupSymbolName ( sb . ToString ( ) ) ;
298
+ return _fixupSymbolName ( sb . ToString ( ) ) ;
335
299
}
336
300
337
301
private static string MapType ( Type t ) => t . Name switch
@@ -374,7 +338,7 @@ private static bool TryIsMethodGetParametersUnsupported(MethodInfo method, [NotN
374
338
{
375
339
// FIXME: System.Reflection.MetadataLoadContext can't decode function pointer types
376
340
// https://github.com/dotnet/runtime/issues/43791
377
- sb . Append ( $ "int { FixupSymbolName ( pinvoke . EntryPoint ) } (int, int, int, int, int);") ;
341
+ sb . Append ( $ "int { _fixupSymbolName ( pinvoke . EntryPoint ) } (int, int, int, int, int);") ;
378
342
return sb . ToString ( ) ;
379
343
}
380
344
@@ -390,7 +354,7 @@ private static bool TryIsMethodGetParametersUnsupported(MethodInfo method, [NotN
390
354
}
391
355
392
356
sb . Append ( MapType ( method . ReturnType ) ) ;
393
- sb . Append ( $ " { FixupSymbolName ( pinvoke . EntryPoint ) } (") ;
357
+ sb . Append ( $ " { _fixupSymbolName ( pinvoke . EntryPoint ) } (") ;
394
358
int pindex = 0 ;
395
359
var pars = method . GetParameters ( ) ;
396
360
foreach ( var p in pars )
@@ -404,7 +368,7 @@ private static bool TryIsMethodGetParametersUnsupported(MethodInfo method, [NotN
404
368
return sb . ToString ( ) ;
405
369
}
406
370
407
- private static void EmitNativeToInterp ( StreamWriter w , ref List < PInvokeCallback > callbacks )
371
+ private void EmitNativeToInterp ( StreamWriter w , ref List < PInvokeCallback > callbacks )
408
372
{
409
373
// Generate native->interp entry functions
410
374
// These are called by native code, so they need to obtain
@@ -450,7 +414,7 @@ private static void EmitNativeToInterp(StreamWriter w, ref List<PInvokeCallback>
450
414
451
415
bool is_void = method . ReturnType . Name == "Void" ;
452
416
453
- string module_symbol = method . DeclaringType ! . Module ! . Assembly ! . GetName ( ) ! . Name ! . Replace ( "." , "_" ) ;
417
+ string module_symbol = _fixupSymbolName ( method . DeclaringType ! . Module ! . Assembly ! . GetName ( ) ! . Name ! ) ;
454
418
uint token = ( uint ) method . MetadataToken ;
455
419
string class_name = method . DeclaringType . Name ;
456
420
string method_name = method . Name ;
@@ -517,7 +481,7 @@ private static void EmitNativeToInterp(StreamWriter w, ref List<PInvokeCallback>
517
481
foreach ( var cb in callbacks )
518
482
{
519
483
var method = cb . Method ;
520
- string module_symbol = method . DeclaringType ! . Module ! . Assembly ! . GetName ( ) ! . Name ! . Replace ( "." , "_" ) ;
484
+ string module_symbol = _fixupSymbolName ( method . DeclaringType ! . Module ! . Assembly ! . GetName ( ) ! . Name ! ) ;
521
485
string class_name = method . DeclaringType . Name ;
522
486
string method_name = method . Name ;
523
487
w . WriteLine ( $ "\" { module_symbol } _{ class_name } _{ method_name } \" ,") ;
0 commit comments