From: Olaf Wintermann Date: Wed, 9 Jul 2025 17:53:06 +0000 (+0200) Subject: free args after creating widgets X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=7d7e87d656a6fbcc69731c8f1dbe8b51a298e62e;p=rssreader.git free args after creating widgets --- diff --git a/ui-java/src/main/java/de/unixwork/ui/AbstractWidgetBuilder.java b/ui-java/src/main/java/de/unixwork/ui/AbstractWidgetBuilder.java index 69cb23e..bdff205 100644 --- a/ui-java/src/main/java/de/unixwork/ui/AbstractWidgetBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/AbstractWidgetBuilder.java @@ -6,7 +6,9 @@ import java.lang.invoke.MethodHandle; public abstract class AbstractWidgetBuilder { UiObject obj; + MemorySegment args; MethodHandle widgetConstructor; + MethodHandle argsFree; public abstract MemorySegment createArgs(Arena arena) throws Throwable; @@ -15,9 +17,21 @@ public abstract class AbstractWidgetBuilder { try (Arena arena = Arena.ofConfined()) { MemorySegment args = createArgs(arena); widget = new UiWidget((MemorySegment) widgetConstructor.invoke(obj.ptr, args)); + freeArgs(); } catch (Throwable e) { throw new RuntimeException(e); } return widget; } + + void freeArgs() { + if(argsFree != null) { + try { + argsFree.invoke(args); + args = null; + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java index 9077d8c..ca41a93 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java @@ -114,7 +114,7 @@ public class ButtonBuilder extends AbstractWidgetBuilder { public MemorySegment createArgs(Arena arena) throws Throwable { ArgFuncs ui = ArgFuncs.getInstance(); - MemorySegment args = (MemorySegment)ui.button_args_new.invoke(); + args = (MemorySegment)ui.button_args_new.invoke(); if(fill) { ui.button_args_set_fill.invoke(args, fill); } diff --git a/ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java index 473d741..74ea325 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ContainerBuilder.java @@ -123,7 +123,7 @@ public class ContainerBuilder extends AbstractWidgetBuilder{ public MemorySegment createArgs(Arena arena) throws Throwable { ArgFuncs ui = ArgFuncs.getInstance(); - MemorySegment args = (MemorySegment)ui.container_args_new.invoke(); + args = (MemorySegment)ui.container_args_new.invoke(); if(fill) { ui.container_args_set_fill.invoke(args, fill); } diff --git a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java index 3e644ad..93d6b2e 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java @@ -32,6 +32,7 @@ public class ListViewBuilder extends AbstractWidgetBuilder { public ListViewBuilder(UiObject obj, MethodHandle widgetConstructor) { this.obj = obj; this.widgetConstructor = widgetConstructor; + this.argsFree = ArgFuncs.getInstance().list_args_free; } public ListViewBuilder fill(boolean fill) { @@ -123,7 +124,7 @@ public class ListViewBuilder extends AbstractWidgetBuilder { public MemorySegment createArgs(Arena arena) throws Throwable { ArgFuncs ui = ArgFuncs.getInstance(); - MemorySegment args = (MemorySegment) ui.list_args_new.invoke(); + args = (MemorySegment) ui.list_args_new.invoke(); if (fill) { ui.list_args_set_fill.invoke(args, fill); } diff --git a/ui-java/src/main/java/de/unixwork/ui/SplitPaneBuilder.java b/ui-java/src/main/java/de/unixwork/ui/SplitPaneBuilder.java index f5211db..e605f1c 100644 --- a/ui-java/src/main/java/de/unixwork/ui/SplitPaneBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/SplitPaneBuilder.java @@ -27,6 +27,7 @@ public class SplitPaneBuilder extends AbstractWidgetBuilder{ public SplitPaneBuilder(UiObject obj, MethodHandle widgetConstructor) { this.obj = obj; this.widgetConstructor = widgetConstructor; + this.argsFree = ArgFuncs.getInstance().splitpane_args_free; } public SplitPaneBuilder fill(boolean fill) { diff --git a/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java index 02277b4..1fc1bdc 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java @@ -27,6 +27,7 @@ public class ToggleBuilder extends AbstractWidgetBuilder { public ToggleBuilder(UiObject obj, MethodHandle widgetConstructor) { this.obj = obj; this.widgetConstructor = widgetConstructor; + this.argsFree = ArgFuncs.getInstance().toggle_args_free; } public ToggleBuilder fill(boolean fill) { @@ -122,7 +123,7 @@ public class ToggleBuilder extends AbstractWidgetBuilder { public MemorySegment createArgs(Arena arena) throws Throwable { ArgFuncs ui = ArgFuncs.getInstance(); - MemorySegment args = (MemorySegment)ui.toggle_args_new.invoke(); + args = (MemorySegment)ui.toggle_args_new.invoke(); if(fill) { // TODO }