@@ -320,11 +320,21 @@ public void WriteDataType(
320
320
{
321
321
writer . WriteByte ( ( byte ) nanoCLR_DataType . DATATYPE_SZARRAY ) ;
322
322
323
- if ( alsoWriteSubType )
323
+ var array = ( ArrayType ) typeDefinition ;
324
+
325
+ if ( array . ElementType . IsGenericParameter )
324
326
{
325
- var array = ( ArrayType ) typeDefinition ;
327
+ // ECMA 335 VI.B.4.3 Metadata
328
+ writer . WriteByte ( ( byte ) nanoCLR_DataType . DATATYPE_VAR ) ;
329
+
330
+ writer . WriteByte ( ( byte ) ( array . ElementType as GenericParameter ) . Position ) ;
331
+ }
332
+ else if ( alsoWriteSubType )
333
+ {
334
+
326
335
WriteDataType ( array . ElementType , writer , true , expandEnumType , isTypeDefinition ) ;
327
336
}
337
+
328
338
return ;
329
339
}
330
340
@@ -344,16 +354,29 @@ public void WriteDataType(
344
354
345
355
if ( typeDefinition . IsGenericInstance )
346
356
{
357
+ // following ECMA-335 VI.B.4.3 Metadata
358
+ writer . WriteByte ( ( byte ) nanoCLR_DataType . DATATYPE_GENERICINST ) ;
359
+
347
360
var genericType = ( GenericInstanceType ) typeDefinition ;
348
- WriteDataType ( genericType . ElementType , writer , alsoWriteSubType , expandEnumType , isTypeDefinition ) ;
361
+
362
+ WriteDataType ( genericType . ElementType , writer , false , expandEnumType , isTypeDefinition ) ;
363
+
364
+ writer . WriteByte ( ( byte ) genericType . GenericArguments . Count ) ;
365
+
366
+ foreach ( var a in genericType . GenericArguments )
367
+ {
368
+ WriteDataType ( a , writer , true , expandEnumType , isTypeDefinition ) ;
369
+ }
370
+
349
371
return ;
350
372
}
351
373
352
374
if ( typeDefinition . IsGenericParameter )
353
375
{
354
- // generic parameter should be declared as object
355
- // the CLR is able to resolve to the correct type
356
- writer . WriteByte ( ( byte ) nanoCLR_DataType . DATATYPE_OBJECT ) ;
376
+ // following ECMA-335 VI.B.4.3 Metadata
377
+
378
+ writer . WriteByte ( ( byte ) nanoCLR_DataType . DATATYPE_MVAR ) ;
379
+ writer . WriteByte ( ( byte ) ( typeDefinition as GenericParameter ) . Position ) ;
357
380
return ;
358
381
}
359
382
@@ -380,7 +403,8 @@ private byte[] GetSignature(
380
403
{
381
404
var binaryWriter = nanoBinaryWriter . CreateBigEndianBinaryWriter ( writer ) ;
382
405
383
- binaryWriter . WriteByte ( 0x06 ) ; // Field reference calling convention
406
+ // Field reference calling convention
407
+ binaryWriter . WriteByte ( 0x06 ) ;
384
408
WriteTypeInfo ( fieldReference . FieldType , binaryWriter ) ;
385
409
386
410
return buffer . ToArray ( ) ;
@@ -394,8 +418,25 @@ internal byte[] GetSignature(
394
418
using ( var writer = new BinaryWriter ( buffer ) ) // Only Write(Byte) will be used
395
419
{
396
420
var binaryWriter = nanoBinaryWriter . CreateLittleEndianBinaryWriter ( writer ) ;
397
- writer . Write ( ( byte ) ( methodReference . HasThis ? 0x20 : 0x00 ) ) ;
398
421
422
+ // method calling convention
423
+
424
+ // IMAGE_CEE_CS_CALLCONV_DEFAULT: 0x00
425
+ // IMAGE_CEE_CS_CALLCONV_HASTHIS: 0x20
426
+ // IMAGE_CEE_CS_CALLCONV_GENERIC: 0x10
427
+
428
+ byte callingConvention = methodReference . HasThis ? ( byte ) 0x20 : ( byte ) 0x00 ;
429
+ callingConvention |= ( byte ) methodReference . CallingConvention ;
430
+
431
+ writer . Write ( callingConvention ) ;
432
+
433
+ // generic parameters count, if any
434
+ if ( methodReference . CallingConvention == MethodCallingConvention . Generic )
435
+ {
436
+ writer . Write ( ( byte ) ( methodReference as MethodReference ) . GenericParameters . Count ) ;
437
+ }
438
+
439
+ // regular parameter count
399
440
writer . Write ( ( byte ) ( methodReference . Parameters . Count ) ) ;
400
441
401
442
WriteTypeInfo ( methodReference . ReturnType , binaryWriter ) ;
@@ -670,14 +711,6 @@ private void WriteSubTypeInfo(TypeReference typeDefinition, nanoBinaryWriter wri
670
711
{
671
712
writer . WriteMetadataToken ( ( uint ) referenceId << 2 ) ;
672
713
}
673
- else if ( typeDefinition . Resolve ( ) . HasGenericParameters &&
674
- _context . GenericParamsTable . TryGetParameterId (
675
- typeDefinition . Resolve ( ) . GenericParameters . FirstOrDefault ( ) ,
676
- out referenceId ) )
677
- {
678
- // TODO
679
- writer . WriteMetadataToken ( ( uint ) referenceId << 2 ) ;
680
- }
681
714
else
682
715
{
683
716
throw new ArgumentException ( $ "Can't find entry in type reference table for { typeDefinition . FullName } .") ;
0 commit comments