@@ -10,6 +10,7 @@ import scala.concurrent.Await
1010import scala .concurrent .duration .Duration
1111import scala .concurrent .ExecutionContext .Implicits .global
1212import scala .reflect .ClassTag
13+ import scala .util .chaining .*
1314
1415trait TransferSpec [ThreadException <: Throwable ](val slinc : Slinc )(using
1516 ClassTag [ThreadException ]
@@ -28,7 +29,7 @@ trait TransferSpec[ThreadException <: Throwable](val slinc: Slinc)(using
2829
2930 case class F (u : CUnion [(CInt , CFloat )]) derives Struct
3031
31- case class G (arr : SetSizeArray [CLong , 2 ]) derives Struct
32+ case class G (long : CLong , arr : SetSizeArray [CLong , 2 ]) derives Struct
3233
3334 test(" can read and write jvm ints" ) {
3435 Scope .global {
@@ -162,20 +163,16 @@ trait TransferSpec[ThreadException <: Throwable](val slinc: Slinc)(using
162163 }
163164 }
164165
165- test(" varargs can be sent and retrieved " ):
166+ test(" varargs can receive primitive types " ):
166167 Scope .confined {
167- val vaListForVaList = VarArgsBuilder (4 ).build
168168 val vaList = VarArgsBuilder (
169169 4 .toByte,
170170 5 .toShort,
171171 6 ,
172172 7 .toLong,
173173 2f ,
174174 3d ,
175- Null [Int ],
176- A (1 , 2 ),
177- CLong (4 : Byte ),
178- vaListForVaList
175+ Null [Int ]
179176 ).build
180177
181178 assertEquals(vaList.get[Byte ], 4 .toByte, " byte assert" )
@@ -185,24 +182,118 @@ trait TransferSpec[ThreadException <: Throwable](val slinc: Slinc)(using
185182 assertEquals(vaList.get[Float ], 2f , " float assert" )
186183 assertEquals(vaList.get[Double ], 3d , " double assert" )
187184 assertEquals(
188- vaList.get[Ptr [Int ]].mem.asAddress ,
189- Null [Int ].mem.asAddress ,
185+ vaList.get[Ptr [Int ]],
186+ Null [Int ],
190187 " ptr assert"
191188 )
189+ }
190+
191+ test(" varargs can receive complex types" .ignore):
192+ Scope .confined {
193+ val vaListForVaList = VarArgsBuilder (4 ).build
194+ val vaList = VarArgsBuilder (
195+ A (1 , 2 ),
196+ CLong (4 ),
197+ A (3 , 4 ),
198+ SetSizeArray (1 , 2 , 3 , 4 ),
199+ vaListForVaList,
200+ CUnion [(CInt , CFloat )].tap(_.set(5 )),
201+ // Null[Int],
202+ A (3 , 4 )
203+ ).build
204+
192205 assertEquals(vaList.get[A ], A (1 , 2 ), " struct assert" )
193206 assertEquals(vaList.get[CLong ], CLong (4 : Byte ), " alias assert" )
194- assertEquals(vaList.get[VarArgs ].get[CInt ], 4 )
207+ assertEquals(vaList.get[A ], A (3 , 4 ))
208+ assertEquals(
209+ vaList.get[SetSizeArray [CInt , 4 ]].toSeq,
210+ Seq (1 , 2 , 3 , 4 ),
211+ " set size array assert"
212+ )
213+ assertEquals(
214+ vaListForVaList.get[VarArgs ].get[Int ],
215+ 4
216+ )
217+ assertEquals(
218+ vaList.get[CUnion [(CLongLong , CFloat )]].get[CLongLong ],
219+ 5L ,
220+ " cunion assert"
221+ )
222+ // assertEquals(
223+ // vaList.get[Ptr[Int]],
224+ // Null[Int]
225+ // )
226+ assertEquals(
227+ vaList.get[A ],
228+ A (3 , 4 ),
229+ " struct assert 2"
230+ )
195231 }
196232
197- test(" varargs can be skipped " ):
233+ test(" varargs can skip primitive types " ):
198234 Scope .confined {
199235 val vaList = VarArgsBuilder (
200- 4 .toByte,
201- 2f
236+ 4 : Byte ,
237+ 5 : Short ,
238+ 6 ,
239+ 7L ,
240+ 2f ,
241+ 3d ,
242+ Null [Int ]
202243 ).build
203244
245+ val vaList2 = vaList.copy()
246+
204247 vaList.skip[Byte ]
205- assertEquals(vaList.get[Float ], 2f )
248+ assertEquals(vaList.get[Short ], 5 : Short )
249+ vaList.skip[Int ]
250+ assertEquals(vaList.get[Long ], 7L )
251+ vaList.skip[Float ]
252+ assertEquals(vaList.get[Double ], 3d )
253+ vaList.skip[Ptr [Int ]]
254+
255+ assertEquals(vaList2.get[Byte ], 4 : Byte )
256+ vaList2.skip[Short ]
257+ assertEquals(vaList2.get[Int ], 6 )
258+ vaList2.skip[Long ]
259+ assertEquals(vaList2.get[Float ], 2f )
260+ vaList2.skip[Double ]
261+ assertEquals(vaList2.get[Ptr [Int ]], Null [Int ])
262+ }
263+
264+ test(" varargs can skip complex types" .ignore):
265+ Scope .confined {
266+ val vaListForVaList = VarArgsBuilder (4 , 5 , 6 ).build
267+ val vaList = VarArgsBuilder (
268+ A (1 , 2 ),
269+ CLong (4 ),
270+ vaListForVaList,
271+ CUnion [(CInt , CFloat )].tap(_.set(5 )),
272+ SetSizeArray (1 , 2 , 3 , 4 )
273+ ).build
274+
275+ val vaList2 = vaList.copy()
276+
277+ assertEquals(vaList.get[A ], A (1 , 2 ), " struct assert" )
278+ vaList.skip[CLong ]
279+ val vaList3 = vaList.get[VarArgs ]
280+ assertEquals(
281+ List (vaList3.get[Int ], vaList3.get[Int ], vaList3.get[Int ]),
282+ List (4 , 5 , 6 ),
283+ " varargs assert"
284+ )
285+ vaList.skip[CUnion [(CInt , CFloat )]]
286+ assertEquals(
287+ vaList.get[SetSizeArray [Int , 4 ]].toSeq,
288+ Seq (1 , 2 , 3 , 4 ),
289+ " set size array assert"
290+ )
291+
292+ vaList2.skip[A ]
293+ assertEquals(vaList2.get[CLong ], CLong (4 ))
294+ vaList2.skip[VarArgs ]
295+ assertEquals(vaList2.get[CUnion [(CInt , CFloat )]].get[Int ], 5 )
296+ vaList2.skip[SetSizeArray [Int , 4 ]]
206297 }
207298
208299 test(" varargs can be copied and reread" ):
@@ -373,7 +464,7 @@ trait TransferSpec[ThreadException <: Throwable](val slinc: Slinc)(using
373464 }
374465
375466 test(" can copy G to native memory and back" ):
376- val g = G (SetSizeArray (CLong (1 ), CLong (2 )))
467+ val g = G (CLong ( 5 ), SetSizeArray (CLong (1 ), CLong (2 )))
377468
378469 Scope .confined {
379470 val ptr = Ptr .copy(g)
0 commit comments