MemorySegment resultPtr = (MemorySegment) {{ ffi_handle }}.invoke({{ args_joined }});
{{ named_frees }} if (resultPtr.equals(MemorySegment.NULL)) {
checkLastFfiError();
return null;
}
Throwable conversionFailure = null;
try {
String result = resultPtr.reinterpret(Long.MAX_VALUE).getString(0);
return result;
} catch (Throwable failure) {
conversionFailure = failure;
throw failure;
} finally {
try {
NativeLib.{{ prefix_upper }}_FREE_STRING.invoke(resultPtr);
} catch (Throwable cleanupFailure) {
if (conversionFailure != null) conversionFailure.addSuppressed(cleanupFailure);
else throw cleanupFailure;
}
}