Bindings crash on Windows where they would not before
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Mar 31 09:02:45 UTC 2025
Hi,
thanks for the report.
I think the fix should still take into account for platform mismatches.
Note that we now have a shared section, containing constants for all
platforms) and a follow up sections where we initialize
platform-specific constants.
The shared section only contains LONG_LONG, which is always 64 bits,
even in Windows.
The followup section contains LONG, which is 32bit/OfInt on Windows, and
64bit/OfLong elsewhere. What the follow up section does is determined by
`TypeImpl.IS_WINDOWS`, which is defned here:
https://github.com/openjdk/jextract/blob/master/src/main/java/org/openjdk/jextract/impl/TypeImpl.java#L45C1-L45C98
So, on Windows the right thing should happen.
Maybe the problem is that you are trying to generate Windows bindings
from a Linux machine? While the code used to work differently (e.g. no
class cast exception), the bindings might behave unpredictably on
Windows. It probably just happened that you never worked with libraries
using `long` (which, for the portability issues you noted, is often
avoided). If you have e.g. a struct containing a long field, the size
and offsets of that struct would be completely bogus, so I would not
recommend to use jextract in that cross-platform way -- it is not
designed to work that way. The new error message points this out a
little earlier (before something worse occurs).
> For instance the platform check could be done at runtime.
Yes, but at the end of the day we have to assign either a `OfLong`
field, or a `OfLongLong` field. And we can't change the type of the
field at runtime. Which means the type of the field is picked at
extraction time (this was also the case before the fix), and at runtime
we cast whatever `canonicalLayout` returns to the expected type (which
throws if there is a mismatch).
Perhaps, a slightly more lenient way to handle this would be to just
leave the layouts to `null` if there's a mismatch (instead of throwing).
This means that bindings only using "portable" layouts would still work.
But, while this might fix your issue, I'm not 100% sure that would be
much better in the general case.
Maurizio
More information about the jextract-dev
mailing list