alef-backend-java 0.15.70

Java (Panama FFM) backend for alef
Documentation
    /** Register a {{ trait_pascal }} implementation via Panama FFM upcall stubs. */
{% if has_super_trait %}    public static void register{{ trait_pascal }}(final I{{ trait_pascal }} impl) throws Exception {
{% else %}    public static void register{{ trait_pascal }}(final I{{ trait_pascal }} impl, String name) throws Exception {
{% endif %}        var bridge = new {{ bridge_class }}(impl);
        try {
            try (var nameArena = Arena.ofShared()) {
                var nameCs = nameArena.allocateFrom({{ name_expr }});
                MemorySegment outErr = nameArena.allocate(ValueLayout.ADDRESS);
                int rc = (int) NativeLib.{{ prefix_upper }}_REGISTER_{{ trait_snake_upper }}.invoke(nameCs, bridge.vtableSegment(), MemorySegment.NULL, outErr);
                if (rc != 0) {
                    MemorySegment errPtr = outErr.get(ValueLayout.ADDRESS, 0);
                    String msg = errPtr.equals(MemorySegment.NULL) ? "registration failed (rc=" + rc + ")" : errPtr.reinterpret(Long.MAX_VALUE).getString(0);
                    throw new RuntimeException("register{{ trait_pascal }}: " + msg);
                }
            }
        } catch (Throwable t) {
            bridge.close();
            if (t instanceof Exception e) {
                throw e;
            } else {
                throw new RuntimeException("Unexpected error during registration", t);
            }
        }
        {{ registry_field }}.put({{ name_expr }}, bridge);
    }