[foreign-jextract] Duplicated interface declarations when using typedefs for function pointers
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Jan 28 18:57:32 UTC 2021
Filed this:
https://bugs.openjdk.java.net/browse/JDK-8260602
Thanks for the report!
Maurizio
On Thu, 2021-01-28 at 17:57 +0000, Maurizio Cimadamore wrote:
> This seems odd. But I guess I can see why jextract ends up doing
> that.
>
> I think what jextract *should* do is to reuse the interface for
> `callback_t` whenever possible (which should be declared at the
> toplevel).
>
> In other words, it seems like jextract is re-generating a new
> interface
> every time it encounters a reference to a function pointer typedef,
> which seems a bug.
>
> Maurizio
>
>
>
> On Thu, 2021-01-28 at 18:48 +0100, Filip Krakowski wrote:
> > Hi,
> >
> > I just noticed that jextract generates duplicate code (interfaces)
> > for
> > function pointers within each struct instead at the top-level.
> > Each interface's name seems to have a suffix based on the
> > occurrence
> > of
> > the declaration in the source file.
> >
> > typedef void (*callback_t)(void *arg);
> >
> > typedef struct first_handler {
> > callback_t cb;
> > } first_handler_t;
> >
> > typedef struct second_handler {
> > callback_t cb;
> > } second_handler_t;
> >
> > This code generates the following java source code.
> >
> > @C("struct first_handler")public static class first_handler {
> > ...
> > public static interface cb {
> >
> > void apply(jdk.incubator.foreign.MemoryAddress
> > x0);
> >
> > public static @C("callback_t") MemorySegment
> > allocate(cb fi) {
> > return RuntimeHelper.upcallStub(cb.class, fi,
> > ucx_h_constants_0.cb$FUNC(),
> > "(Ljdk/incubator/foreign/MemoryAddress;)V");
> > }
> >
> > public static @C("callback_t") MemorySegment
> > allocate(cb fi, NativeScope scope) {
> > return allocate(fi).handoff(scope);
> > }
> > }
> > ...
> > }
> >
> > @C("struct second_handler")public static class second_handler {
> > ...
> > public static interface cb$0 {
> >
> > void apply(jdk.incubator.foreign.MemoryAddress
> > x0);
> >
> > public static @C("callback_t") MemorySegment
> > allocate(cb$0 fi) {
> > return RuntimeHelper.upcallStub(cb$0.class,
> > fi,
> > ucx_h_constants_0.cb$0$FUNC(),
> > "(Ljdk/incubator/foreign/MemoryAddress;)V");
> > }
> >
> > public static @C("callback_t") MemorySegment
> > allocate(cb$0 fi, NativeScope scope) {
> > return allocate(fi).handoff(scope);
> > }
> > }
> > ...
> > }
> >
> > From my point of view both interfaces are identical. Is there a
> > reason
> > for placing them inside the struct class?
> >
> >
> > Best regards
> > Filip
> >
> >
More information about the panama-dev
mailing list