mirror of
https://github.com/slint-ui/slint.git
synced 2025-08-04 02:39:28 +00:00
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:
parent
22095ccf03
commit
1b17fe3c1d
2 changed files with 115 additions and 37 deletions
41
api/python/tests/test_gc.py
Normal file
41
api/python/tests/test_gc.py
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue