@@ -27,6 +27,7 @@ class TSBindingsGenerator : ISourceGenerator
27
27
28
28
private static INamedTypeSymbol _stringSymbol ;
29
29
private static INamedTypeSymbol _intSymbol ;
30
+ private static INamedTypeSymbol _uintSymbol ;
30
31
private static INamedTypeSymbol _floatSymbol ;
31
32
private static INamedTypeSymbol _doubleSymbol ;
32
33
private static INamedTypeSymbol _byteSymbol ;
@@ -54,6 +55,7 @@ public void Execute(GeneratorExecutionContext context)
54
55
{
55
56
_stringSymbol = context . Compilation . GetTypeByMetadataName ( "System.String" ) ;
56
57
_intSymbol = context . Compilation . GetTypeByMetadataName ( "System.Int32" ) ;
58
+ _uintSymbol = context . Compilation . GetTypeByMetadataName ( "System.UInt32" ) ?? throw new Exception ( $ "System.UInt32") ;
57
59
_floatSymbol = context . Compilation . GetTypeByMetadataName ( "System.Single" ) ;
58
60
_doubleSymbol = context . Compilation . GetTypeByMetadataName ( "System.Double" ) ;
59
61
_byteSymbol = context . Compilation . GetTypeByMetadataName ( "System.Byte" ) ;
@@ -108,7 +110,7 @@ from type in GetNamespaceTypes(module)
108
110
109
111
if ( messageType . Name . EndsWith ( "Params" ) )
110
112
{
111
- GenerateUmarshaler ( messageType , sb , packValue ) ;
113
+ GenerateUnmarshaler ( messageType , sb , packValue ) ;
112
114
}
113
115
114
116
if ( messageType . Name . EndsWith ( "Return" ) )
@@ -263,7 +265,7 @@ private void GenerateMarshaler(INamedTypeSymbol parametersType, IndentedStringBu
263
265
}
264
266
}
265
267
266
- private void GenerateUmarshaler ( INamedTypeSymbol parametersType , IndentedStringBuilder sb , int packValue )
268
+ private void GenerateUnmarshaler ( INamedTypeSymbol parametersType , IndentedStringBuilder sb , int packValue )
267
269
{
268
270
using ( sb . BlockInvariant ( $ "public static unmarshal(pData:number) : { parametersType . Name } ") )
269
271
{
@@ -344,7 +346,14 @@ private void GenerateUmarshaler(INamedTypeSymbol parametersType, IndentedStringB
344
346
}
345
347
else
346
348
{
347
- sb . AppendLineInvariant ( $ "ret.{ field . Name } = { GetTSType ( field . Type ) } (Module.getValue(pData + { fieldOffset } , \" { GetEMField ( field . Type ) } \" ));") ;
349
+ if ( CanUseEMHeapProperty ( field . Type ) )
350
+ {
351
+ sb . AppendLineInvariant ( $ "ret.{ field . Name } = Module.{ GetEMHeapProperty ( field . Type ) } [(pData + { fieldOffset } ) >> { GetEMTypeShift ( field ) } ];") ;
352
+ }
353
+ else
354
+ {
355
+ sb . AppendLineInvariant ( $ "ret.{ field . Name } = { GetTSType ( field . Type ) } (Module.getValue(pData + { fieldOffset } , \" { GetEMField ( field . Type ) } \" ));") ;
356
+ }
348
357
}
349
358
}
350
359
}
@@ -362,11 +371,15 @@ private void GenerateUmarshaler(INamedTypeSymbol parametersType, IndentedStringB
362
371
}
363
372
}
364
373
374
+ private bool CanUseEMHeapProperty ( ITypeSymbol type )
375
+ => SymbolEqualityComparer . Default . Equals ( type , _uintSymbol ) ;
376
+
365
377
private int GetNativeFieldSize ( IFieldSymbol field )
366
378
{
367
- if (
379
+ if (
368
380
SymbolEqualityComparer . Default . Equals ( field . Type , _stringSymbol )
369
381
|| SymbolEqualityComparer . Default . Equals ( field . Type , _intSymbol )
382
+ || SymbolEqualityComparer . Default . Equals ( field . Type , _uintSymbol )
370
383
|| SymbolEqualityComparer . Default . Equals ( field . Type , _intPtrSymbol )
371
384
|| SymbolEqualityComparer . Default . Equals ( field . Type , _floatSymbol )
372
385
|| SymbolEqualityComparer . Default . Equals ( field . Type , _boolSymbol )
@@ -375,7 +388,7 @@ private int GetNativeFieldSize(IFieldSymbol field)
375
388
{
376
389
return 4 ;
377
390
}
378
- else if ( SymbolEqualityComparer . Default . Equals ( field . Type , _doubleSymbol ) )
391
+ else if ( SymbolEqualityComparer . Default . Equals ( field . Type , _doubleSymbol ) )
379
392
{
380
393
return 8 ;
381
394
}
@@ -385,6 +398,52 @@ private int GetNativeFieldSize(IFieldSymbol field)
385
398
}
386
399
}
387
400
401
+ private int GetEMTypeShift ( IFieldSymbol field )
402
+ {
403
+ var fieldType = field . Type ;
404
+
405
+ if (
406
+ SymbolEqualityComparer . Default . Equals ( fieldType , _stringSymbol )
407
+ || SymbolEqualityComparer . Default . Equals ( fieldType , _intPtrSymbol )
408
+ || fieldType is IArrayTypeSymbol
409
+ )
410
+ {
411
+ return 2 ;
412
+ }
413
+ else if (
414
+ SymbolEqualityComparer . Default . Equals ( fieldType , _intSymbol )
415
+ || SymbolEqualityComparer . Default . Equals ( fieldType , _uintSymbol )
416
+ || SymbolEqualityComparer . Default . Equals ( fieldType , _boolSymbol )
417
+ )
418
+ {
419
+ return 2 ;
420
+ }
421
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _longSymbol ) )
422
+ {
423
+ return 3 ;
424
+ }
425
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _shortSymbol ) )
426
+ {
427
+ return 1 ;
428
+ }
429
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _byteSymbol ) )
430
+ {
431
+ return 0 ;
432
+ }
433
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _floatSymbol ) )
434
+ {
435
+ return 2 ;
436
+ }
437
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _doubleSymbol ) )
438
+ {
439
+ return 3 ;
440
+ }
441
+ else
442
+ {
443
+ throw new NotSupportedException ( $ "Unsupported EM type conversion [{ fieldType } ]") ;
444
+ }
445
+ }
446
+
388
447
private static string GetEMField ( ITypeSymbol fieldType )
389
448
{
390
449
if (
@@ -397,6 +456,7 @@ private static string GetEMField(ITypeSymbol fieldType)
397
456
}
398
457
else if (
399
458
SymbolEqualityComparer . Default . Equals ( fieldType , _intSymbol )
459
+ || SymbolEqualityComparer . Default . Equals ( fieldType , _uintSymbol )
400
460
|| SymbolEqualityComparer . Default . Equals ( fieldType , _boolSymbol )
401
461
)
402
462
{
@@ -428,6 +488,49 @@ private static string GetEMField(ITypeSymbol fieldType)
428
488
}
429
489
}
430
490
491
+ private object GetEMHeapProperty ( ITypeSymbol fieldType )
492
+ {
493
+ if (
494
+ SymbolEqualityComparer . Default . Equals ( fieldType , _stringSymbol )
495
+ || SymbolEqualityComparer . Default . Equals ( fieldType , _intPtrSymbol )
496
+ || fieldType is IArrayTypeSymbol
497
+ || SymbolEqualityComparer . Default . Equals ( fieldType , _intSymbol )
498
+ || SymbolEqualityComparer . Default . Equals ( fieldType , _boolSymbol )
499
+ )
500
+ {
501
+ return "HEAP32" ;
502
+ }
503
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _uintSymbol ) )
504
+ {
505
+ return "HEAPU32" ;
506
+ }
507
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _longSymbol ) )
508
+ {
509
+ // Might overflow
510
+ return "HEAP32" ;
511
+ }
512
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _shortSymbol ) )
513
+ {
514
+ return "HEAP16" ;
515
+ }
516
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _byteSymbol ) )
517
+ {
518
+ return "HEAP8" ;
519
+ }
520
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _floatSymbol ) )
521
+ {
522
+ return "HEAPF32" ;
523
+ }
524
+ else if ( SymbolEqualityComparer . Default . Equals ( fieldType , _doubleSymbol ) )
525
+ {
526
+ return "HEAPF64" ;
527
+ }
528
+ else
529
+ {
530
+ throw new NotSupportedException ( $ "Unsupported EM type conversion [{ fieldType } ]") ;
531
+ }
532
+ }
533
+
431
534
private static string GetTSType ( ITypeSymbol type )
432
535
{
433
536
if ( type == null )
@@ -445,6 +548,7 @@ private static string GetTSType(ITypeSymbol type)
445
548
}
446
549
else if (
447
550
SymbolEqualityComparer . Default . Equals ( type , _intSymbol )
551
+ || SymbolEqualityComparer . Default . Equals ( type , _uintSymbol )
448
552
|| SymbolEqualityComparer . Default . Equals ( type , _floatSymbol )
449
553
|| SymbolEqualityComparer . Default . Equals ( type , _doubleSymbol )
450
554
|| SymbolEqualityComparer . Default . Equals ( type , _byteSymbol )
@@ -481,6 +585,7 @@ private static string GetTSFieldType(ITypeSymbol type)
481
585
}
482
586
else if (
483
587
SymbolEqualityComparer . Default . Equals ( type , _intSymbol )
588
+ || SymbolEqualityComparer . Default . Equals ( type , _uintSymbol )
484
589
|| SymbolEqualityComparer . Default . Equals ( type , _floatSymbol )
485
590
|| SymbolEqualityComparer . Default . Equals ( type , _doubleSymbol )
486
591
|| SymbolEqualityComparer . Default . Equals ( type , _byteSymbol )
0 commit comments