[foreign] rethinking Panama annotations
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Nov 26 17:56:54 UTC 2018
On 26/11/2018 14:15, Maurizio Cimadamore wrote:
> separate patch for adding support for descriptor name resolution in
> callbacks
I've been thinking more about this, and it's not as easy as it looks at
first...
The issue is that if we want to support resolution for both struct names
and callback names, that means that Unresolved essentially becomes a
'descriptor', not a layout. But if we pull on this string more, then we
need to replace descriptor for layout everywhere in the API, de facto
flattening the API (e.g. clients will be using descriptor everywhere,
thus making the descriptor vs. layout split useless).
The only way I see to support name resolution for callbacks and, at the
same time, retain the descriptor vs. layout split, is to tweak the
@NativeCallback annotation so that its value attribute describes a full
address layout, not just the signature of the callback - e.g.
Vanilla
Descriptor-based
Layout-based
Declaration
@NativeCallback("(i32 i32)i32")
interface QsortComp { ... } @NativeCallback("(i32 i32)(qsortComp)i32")
interface QsortComp { ... } @NativeCallback("u64:(i32 i32)(qsortComp)i32")
interface QsortComp { ... }
Use-site
qsort=(u64:[0i32]i32i32u64:(u64:i32u64:i32)i32)v
qsort=(u64: i32 i32 u64:${qsortComp})v qsort=(u64: i32 i32
u64:${qsortComp})v
So, first notice how much compaction we get by being able to refer to
callbacks by name - the use site values in the second and third column
are clearly more legible than the one in the first column, in which tne
entire callback signature has to be repeated (which is also error prone,
if you write these things by hand).
The difference between descriptor-based and layout-based is that in the
former, we are able to refer to a function descriptor directly using an
unresolved hole; in the latter case, the unresolved hole will resolve to
a layout (an address layout whose pointee is a function). Therefore, the
layout-based approach preserves all the properties we care about: it
allows to retain the distinction between layouts and functions, while at
the same time allowing for some for of by-name reference for callbacks.
The small price to pay is that the contents of the @NativeCallback
annotation will now contain not just the callback signature, but the
full address layout corresponding to a function pointer associated to
that callback.
Is this something that we consider acceptable?
Cheers
Maurizio
More information about the panama-dev
mailing list