Python: Fix GC support for callbacks

Make the references to the callbacks visible to the GC
to be able to break cycles.
This commit is contained in:
Simon Hausmann 2024-03-04 10:59:35 +01:00 committed by Simon Hausmann
parent 22095ccf03
commit 1b17fe3c1d
2 changed files with 115 additions and 37 deletions

View file

@ -0,0 +1,41 @@
# Copyright © SixtyFPS GmbH <info@slint.dev>
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
from slint import slint as native
import weakref
import gc
def test_callback_gc():
compiler = native.ComponentCompiler()
compdef = compiler.build_from_source("""
export component Test {
out property <string> test-value: "Ok";
callback test-callback(string) -> string;
}
""", "")
assert compdef != None
instance = compdef.create()
assert instance != None
class Handler:
def __init__(self, instance):
self.instance = instance
def python_callback(self, input):
return input + instance.get_property("test-value")
handler = Handler(instance)
instance.set_callback(
"test-callback", handler.python_callback)
handler = None
assert instance.invoke("test-callback", "World") == "WorldOk"
wr = weakref.ref(instance)
assert wr() is not None
instance = None
gc.collect()
assert wr() is None