@@ -39,6 +39,23 @@ alias dstring = immutable(dchar)[];
39
39
version (D_ObjectiveC ) public import core.attribute : selector;
40
40
version (Posix ) public import core.attribute : gnuAbiTag;
41
41
42
+ // Some ABIs use a complex varargs implementation requiring TypeInfo.argTypes().
43
+ version (X86_64 )
44
+ {
45
+ version (DigitalMars ) version = WithArgTypes;
46
+ else version (Windows ) { /* no need for Win64 ABI */ }
47
+ else version = WithArgTypes;
48
+ }
49
+ version (AArch64 )
50
+ {
51
+ // Apple uses a trivial varargs implementation
52
+ version (OSX ) {}
53
+ else version (iOS) {}
54
+ else version (TVOS){}
55
+ else version (WatchOS) {}
56
+ else version = WithArgTypes;
57
+ }
58
+
42
59
/**
43
60
* All D class objects inherit from Object.
44
61
*/
@@ -390,7 +407,7 @@ class TypeInfo
390
407
/* * Return internal info on arguments fitting into 8byte.
391
408
* See X86-64 ABI 3.2.3
392
409
*/
393
- version (X86_64 ) int argTypes(out TypeInfo arg1, out TypeInfo arg2) @safe nothrow
410
+ version (WithArgTypes ) int argTypes(out TypeInfo arg1, out TypeInfo arg2) @safe nothrow
394
411
{
395
412
arg1 = this ;
396
413
return 0 ;
@@ -430,7 +447,7 @@ class TypeInfo_Enum : TypeInfo
430
447
431
448
override @property size_t talign() nothrow pure const { return base.talign; }
432
449
433
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
450
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
434
451
{
435
452
return base.argTypes(arg1, arg2);
436
453
}
@@ -588,7 +605,7 @@ class TypeInfo_Array : TypeInfo
588
605
return (void []).alignof;
589
606
}
590
607
591
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
608
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
592
609
{
593
610
arg1 = typeid (size_t );
594
611
arg2 = typeid (void * );
@@ -715,7 +732,7 @@ class TypeInfo_StaticArray : TypeInfo
715
732
return value.talign;
716
733
}
717
734
718
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
735
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
719
736
{
720
737
arg1 = typeid (void * );
721
738
return 0 ;
@@ -774,7 +791,7 @@ class TypeInfo_AssociativeArray : TypeInfo
774
791
return (char [int ]).alignof;
775
792
}
776
793
777
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
794
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
778
795
{
779
796
arg1 = typeid (void * );
780
797
return 0 ;
@@ -809,7 +826,7 @@ class TypeInfo_Vector : TypeInfo
809
826
810
827
override @property size_t talign() nothrow pure const { return 16 ; }
811
828
812
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
829
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
813
830
{
814
831
return base.argTypes(arg1, arg2);
815
832
}
@@ -949,7 +966,7 @@ class TypeInfo_Delegate : TypeInfo
949
966
return dg.alignof;
950
967
}
951
968
952
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
969
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
953
970
{
954
971
arg1 = typeid (void * );
955
972
arg2 = typeid (void * );
@@ -1381,7 +1398,7 @@ class TypeInfo_Struct : TypeInfo
1381
1398
1382
1399
override @property immutable (void )* rtInfo() nothrow pure const @safe { return m_RTInfo; }
1383
1400
1384
- version (X86_64 )
1401
+ version (WithArgTypes )
1385
1402
{
1386
1403
override int argTypes (out TypeInfo arg1, out TypeInfo arg2)
1387
1404
{
@@ -1488,7 +1505,7 @@ class TypeInfo_Tuple : TypeInfo
1488
1505
assert (0 );
1489
1506
}
1490
1507
1491
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
1508
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
1492
1509
{
1493
1510
assert (0 );
1494
1511
}
@@ -1530,7 +1547,7 @@ class TypeInfo_Const : TypeInfo
1530
1547
1531
1548
override @property size_t talign() nothrow pure const { return base.talign; }
1532
1549
1533
- version (X86_64 ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
1550
+ version (WithArgTypes ) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
1534
1551
{
1535
1552
return base.argTypes(arg1, arg2);
1536
1553
}
0 commit comments