Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 327f73f

Browse files
authored
Merge pull request #3037 from kinke/TypeInfo_argTypes
Add method TypeInfo.argTypes() for non-Apple AArch64 targets merged-on-behalf-of: Nicholas Wilson <thewilsonator@users.noreply.github.com>
2 parents dc0c353 + f9170de commit 327f73f

File tree

4 files changed

+33
-13
lines changed

4 files changed

+33
-13
lines changed

src/object.d

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,23 @@ alias dstring = immutable(dchar)[];
3939
version (D_ObjectiveC) public import core.attribute : selector;
4040
version (Posix) public import core.attribute : gnuAbiTag;
4141

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+
4259
/**
4360
* All D class objects inherit from Object.
4461
*/
@@ -390,7 +407,7 @@ class TypeInfo
390407
/** Return internal info on arguments fitting into 8byte.
391408
* See X86-64 ABI 3.2.3
392409
*/
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
394411
{
395412
arg1 = this;
396413
return 0;
@@ -430,7 +447,7 @@ class TypeInfo_Enum : TypeInfo
430447

431448
override @property size_t talign() nothrow pure const { return base.talign; }
432449

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)
434451
{
435452
return base.argTypes(arg1, arg2);
436453
}
@@ -588,7 +605,7 @@ class TypeInfo_Array : TypeInfo
588605
return (void[]).alignof;
589606
}
590607

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)
592609
{
593610
arg1 = typeid(size_t);
594611
arg2 = typeid(void*);
@@ -715,7 +732,7 @@ class TypeInfo_StaticArray : TypeInfo
715732
return value.talign;
716733
}
717734

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)
719736
{
720737
arg1 = typeid(void*);
721738
return 0;
@@ -774,7 +791,7 @@ class TypeInfo_AssociativeArray : TypeInfo
774791
return (char[int]).alignof;
775792
}
776793

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)
778795
{
779796
arg1 = typeid(void*);
780797
return 0;
@@ -809,7 +826,7 @@ class TypeInfo_Vector : TypeInfo
809826

810827
override @property size_t talign() nothrow pure const { return 16; }
811828

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)
813830
{
814831
return base.argTypes(arg1, arg2);
815832
}
@@ -949,7 +966,7 @@ class TypeInfo_Delegate : TypeInfo
949966
return dg.alignof;
950967
}
951968

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)
953970
{
954971
arg1 = typeid(void*);
955972
arg2 = typeid(void*);
@@ -1381,7 +1398,7 @@ class TypeInfo_Struct : TypeInfo
13811398

13821399
override @property immutable(void)* rtInfo() nothrow pure const @safe { return m_RTInfo; }
13831400

1384-
version (X86_64)
1401+
version (WithArgTypes)
13851402
{
13861403
override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
13871404
{
@@ -1488,7 +1505,7 @@ class TypeInfo_Tuple : TypeInfo
14881505
assert(0);
14891506
}
14901507

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)
14921509
{
14931510
assert(0);
14941511
}
@@ -1530,7 +1547,7 @@ class TypeInfo_Const : TypeInfo
15301547

15311548
override @property size_t talign() nothrow pure const { return base.talign; }
15321549

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)
15341551
{
15351552
return base.argTypes(arg1, arg2);
15361553
}

src/rt/typeinfo/ti_cdouble.d

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class TypeInfo_r : TypeInfo
6565
return F.alignof;
6666
}
6767

68-
version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
68+
static if (__traits(hasMember, TypeInfo, "argTypes"))
69+
override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
6970
{
7071
arg1 = typeid(double);
7172
arg2 = typeid(double);

src/rt/typeinfo/ti_cfloat.d

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class TypeInfo_q : TypeInfo
6565
return F.alignof;
6666
}
6767

68-
version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
68+
static if (__traits(hasMember, TypeInfo, "argTypes"))
69+
override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
6970
{
7071
arg1 = typeid(double);
7172
return 0;

src/rt/typeinfo/ti_creal.d

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class TypeInfo_c : TypeInfo
6565
return F.alignof;
6666
}
6767

68-
version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
68+
static if (__traits(hasMember, TypeInfo, "argTypes"))
69+
override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
6970
{
7071
arg1 = typeid(real);
7172
arg2 = typeid(real);

0 commit comments

Comments
 (0)