[foreign-jextract] RFR: API refresh - part two (jextract edition) [v2]

Jorn Vernee jvernee at openjdk.java.net
Fri Oct 8 11:45:27 UTC 2021


On Thu, 7 Oct 2021 19:38:45 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>> This patch fixes jextract to work with the latest API changes.
>> 
>> The patch reintroduces overloads for foreign function wrappers which take a scope (since ResourceScope is no longer a subtype of SegmentAllocator).
>> 
>> We will consider later whether to drop these overloads; it is likely that the majority of jextract clients will already have an allocator somewhere, so the extra code is not necessary. On the other hand, if we want overloads, then I think it would also be useful to add an overload that takes a `MemorySegment` and converts it into a `prefixAllocator` (so that clients can store result of foreign function which returns a struct-by-value in a pre-existing segments).
>> 
>> I've made some improvements to the string conversion logic; in a lot of places we were creating a scope, then doing a malloc to allocate a temporary CXString, then extract a Java String from the CXString, and dispose/free the CXString. Since jextract is single-threaded, I replaced all that with an high-order function which takes a segment supplier, and uses a prefix allocator under the hood. This should be way more efficient than what we had - and string conversion is quite frequent in libclang (e.g. `CXCursor::spelling`).
>> 
>> The patch passes all tests.
>
> Maurizio Cimadamore has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Update src/jdk.incubator.jextract/share/classes/jdk/internal/clang/LibClang.java
>   
>   Co-authored-by: Paul Sandoz <paul.d.sandoz at googlemail.com>

Marked as reviewed by jvernee (Committer).

src/jdk.incubator.jextract/share/classes/jdk/internal/clang/LibClang.java line 81:

> 79: 
> 80:     public static String CXStrToString(Function<SegmentAllocator, MemorySegment> segmentSupplier) {
> 81:         MemorySegment cxstr = segmentSupplier.apply(stringAllocator);

I don't see `stringAllocator` anywhere, I guess this should be `STRING_ALLOCATOR`.
Suggestion:

        MemorySegment cxstr = segmentSupplier.apply(STRING_ALLOCATOR);

-------------

PR: https://git.openjdk.java.net/panama-foreign/pull/594


More information about the panama-dev mailing list