Skip to content

Commit 89629e2

Browse files
author
Roberto De Ioris
committed
use placemenet new when dealing with TSharedRef to avoid crahses
1 parent 5efc1aa commit 89629e2

7 files changed

Lines changed: 16 additions & 12 deletions

File tree

‎Source/UnrealEnginePython/Private/Http/UEPyIHttpRequest.cpp‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,7 @@ static int ue_py_ihttp_request_init(ue_PyIHttpRequest *self, PyObject *args, PyO
275275
if (!PyArg_ParseTuple(args, "|ss:__init__", &verb, &url)) {
276276
return -1;
277277
}
278-
279-
self->http_request = FHttpModule::Get().CreateRequest();
278+
new(&self->http_request) TSharedRef<IHttpRequest>(FHttpModule::Get().CreateRequest());
280279
self->py_dict = PyDict_New();
281280
if (verb) {
282281
self->http_request->SetVerb(UTF8_TO_TCHAR(verb));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static PyObject *py_ue_fmenu_builder_end_section(ue_PyFMenuBuilder *self, PyObje
2727

2828
static PyObject *py_ue_fmenu_builder_make_widget(ue_PyFMenuBuilder *self, PyObject * args) {
2929
ue_PySWidget *ret = (ue_PySWidget *)PyObject_New(ue_PySWidget, &ue_PySWidgetType);
30-
ret->s_widget_owned = self->menu_builder->MakeWidget();
30+
new (&ret->s_widget_owned) TSharedRef<SWidget>(self->menu_builder->MakeWidget());
3131
ret->s_widget = &ret->s_widget_owned.Get();
3232
return (PyObject *)ret;
3333
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ static int ue_py_spython_list_view_init(ue_PySPythonListView *self, PyObject *ar
120120
py_delegate->AddToRoot();
121121
handler.BindUObject(py_delegate, &UPythonSlateDelegate::GenerateRow);
122122

123-
self->s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget_owned = SNew(SPythonListView).ListItemsSource(items).OnGenerateRow(handler);
123+
new (&self->s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget_owned) TSharedRef<SWidget>(SNew(SPythonListView).ListItemsSource(items).OnGenerateRow(handler));
124124
self->s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget = &self->s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget_owned.Get();
125125
return 0;
126126
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ static int ue_py_spython_shelf_init(ue_PySPythonShelf *self, PyObject *args, PyO
160160
asset_picker_config.OnAssetSelected = handler;
161161
}
162162

163-
self->s_compound_widget.s_widget.s_widget_owned = module.Get().CreateAssetPicker(asset_picker_config);
163+
new(&self->s_compound_widget.s_widget.s_widget_owned) TSharedRef<SWidget>(module.Get().CreateAssetPicker(asset_picker_config));
164164
self->s_compound_widget.s_widget.s_widget = &self->s_compound_widget.s_widget.s_widget_owned.Get();
165165
return 0;
166166
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ static int ue_py_spython_tree_view_init(ue_PySPythonTreeView *self, PyObject *ar
9797
py_delegate_children->AddToRoot();
9898
handler_children.BindUObject(py_delegate_children, &UPythonSlateDelegate::GetChildren);
9999

100-
self->s_tree_view.s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget_owned = SNew(SPythonTreeView).TreeItemsSource(items).OnGenerateRow(handler).OnGetChildren(handler_children);
100+
new(&self->s_tree_view.s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget_owned) TSharedRef<SWidget>(SNew(SPythonTreeView).TreeItemsSource(items).OnGenerateRow(handler).OnGetChildren(handler_children));
101101
self->s_tree_view.s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget = &self->s_tree_view.s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget_owned.Get();
102102
return 0;
103103
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ template<typename T> ue_PySWidget *py_ue_new_swidget(SWidget *s_widget, PyTypeOb
7777
return ret;
7878
}
7979

80-
#define ue_py_snew(T, field) self->field.s_widget_owned = ue_py_init_swidget<T>((ue_PySWidget *)self); self->field.s_widget = &self->field.s_widget_owned.Get()
80+
#define ue_py_snew(T, field) new(&self->field.s_widget_owned) TSharedRef<SWidget>(ue_py_init_swidget<T>((ue_PySWidget *)self)); self->field.s_widget = &self->field.s_widget_owned.Get()
8181

8282
ue_PySWidget *ue_py_get_swidget(TSharedPtr<SWidget> s_widget);
8383

‎Source/UnrealEnginePython/Private/Wrappers/UEPyFAssetData.cpp‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
#if WITH_EDITOR
44

55
static PyObject *py_ue_fassetdata_get_asset(ue_PyFAssetData *self, PyObject * args) {
6-
return (PyObject *)ue_get_python_wrapper(self->asset_data->GetAsset());
6+
PyObject *ret = (PyObject *)ue_get_python_wrapper(self->asset_data->GetAsset());
7+
if (!ret) {
8+
return PyErr_Format(PyExc_Exception, "unable to get UObject from asset");
9+
}
10+
Py_INCREF(ret);
11+
return ret;
712
}
813

914
static PyObject *py_ue_fassetdata_is_asset_loaded(ue_PyFAssetData *self, PyObject * args) {
@@ -96,7 +101,7 @@ void ue_python_init_fassetdata(PyObject *ue_module) {
96101

97102
PyObject *py_ue_new_fassetdata(FAssetData *asset_data) {
98103
ue_PyFAssetData *ret = (ue_PyFAssetData *)PyObject_New(ue_PyFAssetData, &ue_PyFAssetDataType);
99-
104+
100105
ret->asset_class = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->AssetClass.ToString()));
101106
ret->asset_name = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->AssetName.ToString()));
102107
ret->group_names = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->GroupNames.ToString()));
@@ -107,9 +112,9 @@ PyObject *py_ue_new_fassetdata(FAssetData *asset_data) {
107112
ret->tags_and_values = PyDict_New();
108113
for (auto It = asset_data->TagsAndValues.CreateConstIterator(); It; ++It)
109114
{
110-
PyDict_SetItem(ret->tags_and_values,
111-
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Key.ToString())),
112-
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Value)));
115+
PyDict_SetItem(ret->tags_and_values,
116+
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Key.ToString())),
117+
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Value)));
113118
}
114119

115120
ret->asset_data = asset_data;

0 commit comments

Comments
 (0)