Skip to content

Commit d643d5e

Browse files
author
ikrima
committed
Add PyCalllable_Check_Extended macro to guard against "callable" uscriptstructs which are mutable/reference structs
-Without it, slate argument binding has errors bc it tries to bind delegates to the uscriptstructs
1 parent 1b7f9ea commit d643d5e

12 files changed

Lines changed: 37 additions & 33 deletions

‎Source/UnrealEnginePython/Private/Slate/UEPyFMenuBuilder.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static PyObject *py_ue_fmenu_builder_add_menu_entry(ue_PyFMenuBuilder *self, PyO
4646
if (!PyArg_ParseTuple(args, "ssO|OO:add_menu_entry", &label, &tooltip, &py_callable, &py_obj, &py_uiaction_obj))
4747
return nullptr;
4848

49-
if (!PyCallable_Check(py_callable))
49+
if (!PyCalllable_Check_Extended(py_callable))
5050
{
5151
return PyErr_Format(PyExc_Exception, "argument is not callable");
5252
}

‎Source/UnrealEnginePython/Private/Slate/UEPyFToolBarBuilder.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ static PyObject *py_ue_ftool_bar_builder_add_tool_bar_button(ue_PyFToolBarBuilde
3737
return PyErr_Format(PyExc_Exception, "argument is not a FSlateIcon");
3838
}
3939

40-
if (!PyCallable_Check(py_callable)) {
40+
if (!PyCalllable_Check_Extended(py_callable)) {
4141
return PyErr_Format(PyExc_Exception, "argument is not callable");
4242
}
4343

‎Source/UnrealEnginePython/Private/Slate/UEPySButton.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static PyObject *py_ue_sbutton_bind_on_clicked(ue_PySButton *self, PyObject * ar
2727
return NULL;
2828
}
2929

30-
if (!PyCallable_Check(py_callable))
30+
if (!PyCalllable_Check_Extended(py_callable))
3131
{
3232
return PyErr_Format(PyExc_Exception, "argument is not callable");
3333
}

‎Source/UnrealEnginePython/Private/Slate/UEPySPythonMultiColumnTableRow.h‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ class SPythonMultiColumnTableRow : public SMultiColumnTableRow<TSharedPtr<struct
2222
SMultiColumnTableRow<TSharedPtr<struct FPythonItem> >::Construct(FSuperRowType::FArguments(), InOwnerTableView);
2323
}
2424

25-
virtual TSharedRef<SWidget> GenerateWidgetForColumn( const FName& ColumnName ) override
25+
TSharedRef<SWidget> SPythonMultiColumnTableRow::GenerateWidgetForColumn(const FName& ColumnName)
2626
{
2727
FScopePythonGIL gil;
2828

2929
if (!PyObject_HasAttrString(self, (char *)"generate_widget_for_column"))
3030
return SNullWidget::NullWidget;
3131

3232
PyObject *py_callable_generate_widget_for_column = PyObject_GetAttrString(self, (char *)"generate_widget_for_column");
33-
if (!PyCallable_Check(py_callable_generate_widget_for_column))
33+
if (!PyCalllable_Check_Extended(py_callable_generate_widget_for_column))
3434
{
3535
UE_LOG(LogPython, Error, TEXT("generate_widget_for_column is not a callable"));
3636
return SNullWidget::NullWidget;
@@ -56,14 +56,15 @@ class SPythonMultiColumnTableRow : public SMultiColumnTableRow<TSharedPtr<struct
5656
return value;
5757
}
5858

59-
virtual FReply OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent) override
59+
60+
FReply SPythonMultiColumnTableRow::OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent)
6061
{
6162
FScopePythonGIL gil;
6263

6364
if (PyObject_HasAttrString(self, (char *)"on_mouse_button_double_click"))
6465
{
6566
PyObject *py_callable_on_mouse_button_double_click = PyObject_GetAttrString(self, (char *)"on_mouse_button_double_click");
66-
if (!PyCallable_Check(py_callable_on_mouse_button_double_click))
67+
if (!PyCalllable_Check_Extended(py_callable_on_mouse_button_double_click))
6768
{
6869
UE_LOG(LogPython, Error, TEXT("on_mouse_button_double_click is not a callable"));
6970
return FReply::Unhandled();

‎Source/UnrealEnginePython/Private/Slate/UEPySPythonShelf.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,17 @@ static int ue_py_spython_shelf_init(ue_PySPythonShelf *self, PyObject *args, PyO
8585
}
8686
}
8787

88-
if (py_callable_double_clicked && !PyCallable_Check(py_callable_double_clicked)) {
88+
if (py_callable_double_clicked && !PyCalllable_Check_Extended(py_callable_double_clicked)) {
8989
PyErr_SetString(PyExc_Exception, "argument is not callable");
9090
return -1;
9191
}
9292

93-
if (py_callable_get_context_menu && !PyCallable_Check(py_callable_get_context_menu)) {
93+
if (py_callable_get_context_menu && !PyCalllable_Check_Extended(py_callable_get_context_menu)) {
9494
PyErr_SetString(PyExc_Exception, "argument is not callable");
9595
return -1;
9696
}
9797

98-
if (py_callable_asset_selected && !PyCallable_Check(py_callable_asset_selected)) {
98+
if (py_callable_asset_selected && !PyCalllable_Check_Extended(py_callable_asset_selected)) {
9999
PyErr_SetString(PyExc_Exception, "argument is not callable");
100100
return -1;
101101
}

‎Source/UnrealEnginePython/Private/Slate/UEPySPythonWidget.h‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class SPythonWidget : public SCompoundWidget
3737
return FReply::Unhandled();
3838

3939
PyObject *py_callable_on_key_char = PyObject_GetAttrString(self, (char *)"on_key_char");
40-
if (!PyCallable_Check(py_callable_on_key_char))
40+
if (!PyCalllable_Check_Extended(py_callable_on_key_char))
4141
{
4242
UE_LOG(LogPython, Error, TEXT("on_key_char is not a callable"));
4343
return FReply::Unhandled();
@@ -67,7 +67,7 @@ class SPythonWidget : public SCompoundWidget
6767
return FReply::Unhandled();
6868

6969
PyObject *py_callable_on_key_down = PyObject_GetAttrString(self, (char *)"on_key_down");
70-
if (!PyCallable_Check(py_callable_on_key_down))
70+
if (!PyCalllable_Check_Extended(py_callable_on_key_down))
7171
{
7272
UE_LOG(LogPython, Error, TEXT("on_key_down is not a callable"));
7373
return FReply::Unhandled();
@@ -97,7 +97,7 @@ class SPythonWidget : public SCompoundWidget
9797
return FReply::Unhandled();
9898

9999
PyObject *py_callable_on_mouse_move = PyObject_GetAttrString(self, (char *)"on_mouse_move");
100-
if (!PyCallable_Check(py_callable_on_mouse_move))
100+
if (!PyCalllable_Check_Extended(py_callable_on_mouse_move))
101101
{
102102
UE_LOG(LogPython, Error, TEXT("on_mouse_move is not a callable"));
103103
return FReply::Unhandled();
@@ -127,7 +127,7 @@ class SPythonWidget : public SCompoundWidget
127127
return FReply::Unhandled();
128128

129129
PyObject *py_callable_on_mouse_wheel = PyObject_GetAttrString(self, (char *)"on_mouse_wheel");
130-
if (!PyCallable_Check(py_callable_on_mouse_wheel))
130+
if (!PyCalllable_Check_Extended(py_callable_on_mouse_wheel))
131131
{
132132
UE_LOG(LogPython, Error, TEXT("on_mouse_wheel is not a callable"));
133133
return FReply::Unhandled();
@@ -157,7 +157,7 @@ class SPythonWidget : public SCompoundWidget
157157
return FReply::Unhandled();
158158

159159
PyObject *py_callable_on_mouse_button_down = PyObject_GetAttrString(self, (char *)"on_mouse_button_down");
160-
if (!PyCallable_Check(py_callable_on_mouse_button_down))
160+
if (!PyCalllable_Check_Extended(py_callable_on_mouse_button_down))
161161
{
162162
UE_LOG(LogPython, Error, TEXT("on_mouse_button_down is not a callable"));
163163
return FReply::Unhandled();
@@ -187,7 +187,7 @@ class SPythonWidget : public SCompoundWidget
187187
return FReply::Unhandled();
188188

189189
PyObject *py_callable_on_mouse_button_up = PyObject_GetAttrString(self, (char *)"on_mouse_button_up");
190-
if (!PyCallable_Check(py_callable_on_mouse_button_up))
190+
if (!PyCalllable_Check_Extended(py_callable_on_mouse_button_up))
191191
{
192192
UE_LOG(LogPython, Error, TEXT("on_mouse_button_up is not a callable"));
193193
return FReply::Unhandled();
@@ -226,7 +226,7 @@ class SPythonWidget : public SCompoundWidget
226226
return MaxLayer;
227227

228228
PyObject *py_callable_paint = PyObject_GetAttrString(self, (char *)"paint");
229-
if (!PyCallable_Check(py_callable_paint))
229+
if (!PyCalllable_Check_Extended(py_callable_paint))
230230
{
231231
UE_LOG(LogPython, Error, TEXT("paint is not a callable"));
232232
return MaxLayer;
@@ -257,7 +257,7 @@ class SPythonWidget : public SCompoundWidget
257257
return;
258258

259259
PyObject *py_callable_tick = PyObject_GetAttrString(self, (char *)"tick");
260-
if (!PyCallable_Check(py_callable_tick))
260+
if (!PyCalllable_Check_Extended(py_callable_tick))
261261
{
262262
UE_LOG(LogPython, Error, TEXT("tick is not a callable"));
263263
return;

‎Source/UnrealEnginePython/Private/Slate/UEPySWidget.cpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ static PyObject *py_ue_swidget_bind_on_mouse_button_down(ue_PySWidget *self, PyO
122122
return NULL;
123123
}
124124

125-
if (!PyCallable_Check(py_callable))
125+
if (!PyCalllable_Check_Extended(py_callable))
126126
{
127127
return PyErr_Format(PyExc_Exception, "argument is not callable");
128128
}
@@ -147,7 +147,7 @@ static PyObject *py_ue_swidget_bind_on_mouse_button_up(ue_PySWidget *self, PyObj
147147
return NULL;
148148
}
149149

150-
if (!PyCallable_Check(py_callable))
150+
if (!PyCalllable_Check_Extended(py_callable))
151151
{
152152
return PyErr_Format(PyExc_Exception, "argument is not callable");
153153
}
@@ -172,7 +172,7 @@ static PyObject *py_ue_swidget_bind_on_mouse_double_click(ue_PySWidget *self, Py
172172
return NULL;
173173
}
174174

175-
if (!PyCallable_Check(py_callable))
175+
if (!PyCalllable_Check_Extended(py_callable))
176176
{
177177
return PyErr_Format(PyExc_Exception, "argument is not callable");
178178
}
@@ -197,7 +197,7 @@ static PyObject *py_ue_swidget_bind_on_mouse_move(ue_PySWidget *self, PyObject *
197197
return NULL;
198198
}
199199

200-
if (!PyCallable_Check(py_callable))
200+
if (!PyCalllable_Check_Extended(py_callable))
201201
{
202202
return PyErr_Format(PyExc_Exception, "argument is not callable");
203203
}

‎Source/UnrealEnginePython/Private/Slate/UEPySWindow.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ static int ue_py_swindow_init(ue_PySWindow *self, PyObject *args, PyObject *kwar
242242
#endif
243243

244244
PyObject *on_closed = ue_py_dict_get_item(kwargs, "on_closed");
245-
if (on_closed && PyCallable_Check(on_closed))
245+
if (on_closed && PyCalllable_Check_Extended(on_closed))
246246
{
247247
FOnWindowClosed handler;
248248
UPythonSlateDelegate *py_delegate = NewObject<UPythonSlateDelegate>();

‎Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,7 +1228,7 @@ PyObject *py_unreal_engine_add_menu_extension(PyObject * self, PyObject * args)
12281228
if (!menu_extension_interface)
12291229
return PyErr_Format(PyExc_Exception, "module %s is not supported", module);
12301230

1231-
if (!PyCallable_Check(py_callable))
1231+
if (!PyCalllable_Check_Extended(py_callable))
12321232
return PyErr_Format(PyExc_Exception, "argument is not callable");
12331233

12341234
TSharedRef<FPythonSlateCommands> *commands = new TSharedRef<FPythonSlateCommands>(new FPythonSlateCommands());
@@ -1261,7 +1261,7 @@ PyObject *py_unreal_engine_add_menu_bar_extension(PyObject * self, PyObject * ar
12611261

12621262
FLevelEditorModule &ExtensibleModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
12631263

1264-
if (!PyCallable_Check(py_callable))
1264+
if (!PyCalllable_Check_Extended(py_callable))
12651265
return PyErr_Format(PyExc_Exception, "argument is not callable");
12661266

12671267
TSharedRef<FPythonSlateCommands> *commands = new TSharedRef<FPythonSlateCommands>(new FPythonSlateCommands());
@@ -1294,7 +1294,7 @@ PyObject *py_unreal_engine_add_tool_bar_extension(PyObject * self, PyObject * ar
12941294

12951295
FLevelEditorModule &ExtensibleModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
12961296

1297-
if (!PyCallable_Check(py_callable))
1297+
if (!PyCalllable_Check_Extended(py_callable))
12981298
return PyErr_Format(PyExc_Exception, "argument is not callable");
12991299

13001300
TSharedRef<FPythonSlateCommands> *commands = new TSharedRef<FPythonSlateCommands>(new FPythonSlateCommands());
@@ -1322,7 +1322,7 @@ PyObject *py_unreal_engine_add_asset_view_context_menu_extension(PyObject * self
13221322
return NULL;
13231323
}
13241324

1325-
if (!PyCallable_Check(py_callable))
1325+
if (!PyCalllable_Check_Extended(py_callable))
13261326
return PyErr_Format(PyExc_Exception, "argument is not callable");
13271327

13281328
FContentBrowserModule &ContentBrowser = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
@@ -1350,7 +1350,7 @@ PyObject *py_unreal_engine_register_nomad_tab_spawner(PyObject * self, PyObject
13501350
return NULL;
13511351
}
13521352

1353-
if (!PyCallable_Check(py_callable))
1353+
if (!PyCalllable_Check_Extended(py_callable))
13541354
return PyErr_Format(PyExc_Exception, "argument is not callable");
13551355

13561356
FOnSpawnTab spawn_tab;
@@ -1455,7 +1455,7 @@ PyObject *py_unreal_engine_open_color_picker(PyObject *self, PyObject *args, PyO
14551455
return nullptr;
14561456
}
14571457

1458-
if (!PyCallable_Check(py_callable_on_color_committed))
1458+
if (!PyCalllable_Check_Extended(py_callable_on_color_committed))
14591459
{
14601460
return PyErr_Format(PyExc_Exception, "on_color_committed must be a callable");
14611461
}

‎Source/UnrealEnginePython/Private/Slate/UEPySlate.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ ue_PySWidget *ue_py_get_swidget(TSharedRef<SWidget> s_widget);
163163
{\
164164
PyObject *value = ue_py_dict_get_item(kwargs, _param);\
165165
if (value) {\
166-
if (PyCallable_Check(value)) {\
166+
if (PyCalllable_Check_Extended(value)) {\
167167
_base handler;\
168168
UPythonSlateDelegate *py_delegate = NewObject<UPythonSlateDelegate>();\
169169
py_delegate->SetPyCallable(value);\

0 commit comments

Comments
 (0)