Skip to content

Commit ad4bb0b

Browse files
Add some FFI tests passing/returning union
Those tests include struct in union in struct for challenging X64 SysV implementation
1 parent 8619b6f commit ad4bb0b

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

platforms/Cross/plugins/SqueakFFIPrims/sqFFITestFuncs.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ typedef struct Si2 {int a,b;} ffiTestSi2;
5151
typedef struct Ss2 {short a,b;} ffiTestSs2;
5252
typedef struct Ssi {short a; int b;} ffiTestSsi;
5353
typedef struct Sfi {float a; int b;} ffiTestSfi;
54-
typedef struct Sfd {float a; double b} ffiTestSfd;
54+
typedef struct Sfd {float a; double b;} ffiTestSfd;
5555
typedef struct Sdi {double a; int b;} ffiTestSdi;
5656
typedef struct Ssf {short a; float b;} ffiTestSsf;
5757
typedef struct SsSsi {short a; struct Ssi b;} ffiTestSsSsi;
@@ -66,6 +66,13 @@ typedef struct Sf4 {float a,b,c,d;} ffiTestSf4;
6666
typedef struct Ss4 {short a,b,c,d;} ffiTestSs4;
6767
typedef struct SSdi5 {struct Sdi a,b,c,d,e;} ffiTestSSdi5; /* a structure longer than 8 eightBytes */
6868

69+
typedef union Ufi {float a; int b;} ffiTestUfi;
70+
typedef union Ufd {float a; double b;} ffiTestUfd;
71+
typedef union UdSi2 {double a; struct Si2 b;} ffiTestUdSi2;
72+
73+
typedef struct SUfdUfi {union Ufd a; union Ufi b;} ffiTestSUfdUfi;
74+
typedef struct SUfdUdSi2 {union Ufd a; union UdSi2 b;} ffiTestSUfdUdSi2;
75+
6976
#pragma export on
7077

7178
EXPORT(ffiTestSd2) ffiTestInitSd2 (double a,double b) { ffiTestSd2 v = {a,b}; return v; }
@@ -90,6 +97,15 @@ EXPORT(ffiTestSf4) ffiTestInitSf4 (float a,float b, float c,float d)
9097
EXPORT(ffiTestSs4) ffiTestInitSs4 (short a,short b, short c,short d) { ffiTestSs4 v = {a,b,c,d}; return v; }
9198
EXPORT(ffiTestSSdi5)ffiTestInitSSdi5(struct Sdi a,struct Sdi b,struct Sdi c, struct Sdi d,struct Sdi e) { ffiTestSSdi5 v = {a,b,c,d,e}; return v; }
9299

100+
EXPORT(ffiTestUfi) ffiTestInitUfi_f(float a) { ffiTestUfi v; v.a=a; return v; }
101+
EXPORT(ffiTestUfi) ffiTestInitUfi_i(int b) { ffiTestUfi v; v.b=b; return v; }
102+
EXPORT(ffiTestUfd) ffiTestInitUfd_f(float a) { ffiTestUfd v; v.a=a; return v; }
103+
EXPORT(ffiTestUfd) ffiTestInitUfd_d(double b) { ffiTestUfd v; v.b=b; return v; }
104+
EXPORT(ffiTestUdSi2) ffiTestInitUdSi2_d(double a) { ffiTestUdSi2 v; v.a=a; return v; }
105+
EXPORT(ffiTestUdSi2) ffiTestInitUdSi2_ii(int a,int b) { ffiTestUdSi2 v; v.b.a=a; v.b.b=b; return v; }
106+
EXPORT(ffiTestSUfdUfi) ffiTestInitSUfdUfi (union Ufd a,union Ufi b) { ffiTestSUfdUfi v = {a,b}; return v; }
107+
EXPORT(ffiTestSUfdUdSi2) ffiTestInitSUfdUdSi2 (union Ufd a,union UdSi2 b) { ffiTestSUfdUdSi2 v = {a,b}; return v; }
108+
93109
EXPORT(ffiTestSd2) ffiTestReturnSd2 () { return ffiTestInitSd2(1.0 ,2.0 ); }
94110
EXPORT(ffiTestSf2) ffiTestReturnSf2 () { return ffiTestInitSf2(1.0f,2.0f); }
95111
EXPORT(ffiTestSl2) ffiTestReturnSl2 () { return ffiTestInitSl2(1LL,2LL); }
@@ -131,6 +147,8 @@ EXPORT(double) ffiTestSumSslf(ffiTestSslf x) { return (double) x.a + (double) x.
131147
EXPORT(double) ffiTestSumSslf_2(ffiTestSslf x,ffiTestSslf y) { return ffiTestSumSslf(x) + ffiTestSumSslf(y); }
132148
EXPORT(double) ffiTestSumSslf_4(ffiTestSslf x,ffiTestSslf y,ffiTestSslf z,ffiTestSslf t) { return ffiTestSumSslf_2(x,y) + ffiTestSumSslf_2(z,t); }
133149

150+
EXPORT(double) ffiTestSumSUfdUfi_f(ffiTestSUfdUfi x) {return (double) x.a.a + (double) x.b.a; }; /* sum the float parts */
151+
EXPORT(double) ffiTestSumSUfdUdSi2_d(ffiTestSUfdUdSi2 x) {return x.a.b + x.b.a; }; /* sum the double parts */
134152

135153
EXPORT(char) ffiTestChars(char c1, char c2, char c3, char c4);
136154
EXPORT(short) ffiTestShorts(short c1, short c2, short c3, short c4);

0 commit comments

Comments
 (0)