33#include " UEPyTicker.h"
44
55// destructor
6- static void ue_pyfdelegatehandle_dealloc (ue_PyFDelegateHandle *self) {
7- if (!self->garbaged ) {
6+ static void ue_pyfdelegatehandle_dealloc (ue_PyFDelegateHandle *self)
7+ {
8+ if (!self->garbaged )
9+ {
810 FTicker::GetCoreTicker ().RemoveTicker (self->dhandle );
911 // useless ;)
1012 self->garbaged = true ;
1113 }
12- if (self->py_delegate && self->py_delegate ->IsValidLowLevel () && self->py_delegate ->IsRooted ()) {
13- self->py_delegate ->RemoveFromRoot ();
14- }
1514 Py_TYPE (self)->tp_free ((PyObject *)self);
1615}
1716
@@ -46,7 +45,8 @@ static PyTypeObject ue_PyFDelegateHandleType = {
4645 0 , /* tp_methods */
4746};
4847
49- void ue_python_init_fdelegatehandle (PyObject *ue_module) {
48+ void ue_python_init_fdelegatehandle (PyObject *ue_module)
49+ {
5050 ue_PyFDelegateHandleType.tp_new = PyType_GenericNew;
5151 if (PyType_Ready (&ue_PyFDelegateHandleType) < 0 )
5252 return ;
@@ -55,44 +55,43 @@ void ue_python_init_fdelegatehandle(PyObject *ue_module) {
5555 PyModule_AddObject (ue_module, " FDelegateHandle" , (PyObject *)&ue_PyFDelegateHandleType);
5656}
5757
58- PyObject *py_unreal_engine_add_ticker (PyObject * self, PyObject * args) {
58+ PyObject *py_unreal_engine_add_ticker (PyObject * self, PyObject * args)
59+ {
5960
6061 PyObject *py_callable;
6162 float delay = 0 ;
62- if (!PyArg_ParseTuple (args, " O|f:add_ticker" , &py_callable, &delay)) {
63+ if (!PyArg_ParseTuple (args, " O|f:add_ticker" , &py_callable, &delay))
64+ {
6365 return nullptr ;
6466 }
6567
6668 if (!PyCallable_Check (py_callable))
6769 return PyErr_Format (PyExc_Exception, " argument is not a callable" );
6870
6971 FTickerDelegate ticker_delegate;
70- UPythonDelegate * py_delegate = NewObject<UPythonDelegate>( );
72+ TSharedRef<FPythonSmartDelegate> py_delegate = MakeShareable ( new FPythonSmartDelegate );
7173 py_delegate->SetPyCallable (py_callable);
7274
73- ticker_delegate.BindUObject (py_delegate, &UPythonDelegate::Tick);
74-
75- // avoid the delegate to be GC'ed
76- py_delegate->AddToRoot ();
75+ ticker_delegate.BindSP (py_delegate, &FPythonSmartDelegate::Tick);
7776
7877 FDelegateHandle dhandle = FTicker::GetCoreTicker ().AddTicker (ticker_delegate, delay);
7978 ue_PyFDelegateHandle *ret = (ue_PyFDelegateHandle *)PyObject_New (ue_PyFDelegateHandle, &ue_PyFDelegateHandleType);
80- if (!ret) {
79+ if (!ret)
80+ {
8181 FTicker::GetCoreTicker ().RemoveTicker (dhandle);
82- py_delegate->RemoveFromRoot ();
8382 return PyErr_Format (PyExc_Exception, " unable to allocate FDelegateHandle python object" );
8483 }
8584 ret->dhandle = dhandle;
86- ret->py_delegate = py_delegate;
8785 ret->garbaged = false ;
88-
8986 return (PyObject *)ret;
9087}
9188
92- PyObject *py_unreal_engine_remove_ticker (PyObject * self, PyObject * args) {
89+ PyObject *py_unreal_engine_remove_ticker (PyObject * self, PyObject * args)
90+ {
9391
9492 PyObject *py_obj;
95- if (!PyArg_ParseTuple (args, " O:remove_ticker" , &py_obj)) {
93+ if (!PyArg_ParseTuple (args, " O:remove_ticker" , &py_obj))
94+ {
9695 return NULL ;
9796 }
9897
@@ -101,15 +100,11 @@ PyObject *py_unreal_engine_remove_ticker(PyObject * self, PyObject * args) {
101100
102101 ue_PyFDelegateHandle *py_handle = (ue_PyFDelegateHandle *)py_obj;
103102
104- if (!py_handle->garbaged ) {
103+ if (!py_handle->garbaged )
104+ {
105105 FTicker::GetCoreTicker ().RemoveTicker (py_handle->dhandle );
106106 py_handle->garbaged = true ;
107107 }
108108
109- if (py_handle->py_delegate ) {
110- py_handle->py_delegate ->RemoveFromRoot ();
111- py_handle->py_delegate = nullptr ;
112- }
113-
114109 Py_RETURN_NONE;
115110}
0 commit comments