VaList is buggy on Java 17?

Mark Hammons markehammons at gmail.com
Thu Apr 20 07:05:34 UTC 2023


I'm very sorry, I forgot to show you the test failure I was getting:

==> X fr.hammons.slinc.Transfer17Jitted.varargs can be embedded in structs
 0.225s munit.ComparisonFailException:
/home/mhammons/Documents/slinc/core/test/src/fr/hammons/slinc/TransferSpec.scala:235
234:          ints.foreach: value =>
235:            assertEquals(va.get[CInt], value, "conversion test")
236:
conversion test
=> Obtained
0
=> Diff (- obtained, + expected)
-0
+1

Failing seed: G74hsXncaBhRJ5gYO0IoJVCp1DhYmXm0CSeK35JkZPN=
You can reproduce this failure by adding the following override to your
suite:

  override def scalaCheckInitialSeed =
"G74hsXncaBhRJ5gYO0IoJVCp1DhYmXm0CSeK35JkZPN="

Falsified after 9 passed tests.
> ARG_0: List(0, 0, 0, 0, 0, 0, 0, 1)
> ARG_0_ORIGINAL: List(-1588110949, -1261571563, 0, -554817481, 0,
330801625, 1, 446849842, 1147609259)

What these results indicate is that after the 7th Int retreived from the
VaList, the VaList starts returning 0 instead of the value originally
passed in.

On Thu, Apr 20, 2023 at 9:00 AM Mark Hammons <markehammons at gmail.com> wrote:

> Hi all,
>
> I know that the panama project is pushing forward on java 20 and 21 right
> now, and java 17 is probably not a great concern for you all at the moment,
> but I was testing VaList support in my library, Slinc, and it seems to be
> flaky on Java 17.0.5. The test in question goes like so:
>
>   property("varargs can be embedded in structs"):
>       forAll: (ints: Seq[CInt]) =>
>         val numTake = 8
>         Scope.confined:
>           val va = VarArgsBuilder.fromIterable
>             (
>               ints.map(a => a: Variadic).take(numTake)
>             )
>             .build
>
>           val x = va.copy()
>
>           val p = Ptr.copy(E(x))
>
>           ints.take(numTake).foreach: value =>
>             assertEquals(va.get[CInt], value, "conversion test")
>
>           ints.take(numTake).foreach: value =>
>             assertEquals((!p).list.get[CInt], value)
> Originally in this test I was testing if I could write a VaList to a
> struct and get it back out and pull the values out of it appropriately.
> What I noticed is that if the number of integer values in a row passed into
> VaList is 8 or greater, my test fails. 7 or less ints and the test passes.
> On the Java 19 implementation, this does not happen, nor does this happen
> when I pass a great deal more parameters (but more varied in types, some
> longs, some pointers, some structs). This test passes if I randomly
> generate Long values and pass those into the VaList.
>
> This is not a critical bug by any means. I can sidestep the issue by
> encoding all lower integral types into Long in the java 17 runtime for my
> library. I just wanted to bring this to your attention because it's a weird
> issue that java 17 users of the foreign api may hit.
>
> Thanks for your time,
> Mark Hammons
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20230420/e186b1f6/attachment.htm>


More information about the panama-dev mailing list