Skip to content

Commit 137b75f

Browse files
author
Roberto De Ioris
committed
pass all structs by ref
1 parent 3d3878a commit 137b75f

File tree

5 files changed

+31
-45
lines changed

5 files changed

+31
-45
lines changed

Source/UnrealEnginePython/Private/Slate/UEPyIStructureDetailsView.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static PyObject *py_ue_istructure_details_view_set_structure_data(ue_PyIStructur
5252
Py_XDECREF(self->ue_py_struct);
5353
self->ue_py_struct = ue_py_struct;
5454
Py_INCREF(self->ue_py_struct);
55-
TSharedPtr<FStructOnScope> struct_scope = MakeShared<FStructOnScope>(ue_py_struct->u_struct, ue_py_struct->data);
55+
TSharedPtr<FStructOnScope> struct_scope = MakeShared<FStructOnScope>(ue_py_struct->u_struct, ue_py_struct->u_struct_ptr);
5656
FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
5757
self->istructure_details_view->SetStructureData(struct_scope);
5858

@@ -188,7 +188,7 @@ static int ue_py_istructure_details_view_init(ue_PyIStructureDetailsView *self,
188188

189189
self->ue_py_struct = ue_py_struct;
190190
Py_INCREF(self->ue_py_struct);
191-
TSharedPtr<FStructOnScope> struct_scope = MakeShared<FStructOnScope>(ue_py_struct->u_struct, ue_py_struct->data);
191+
TSharedPtr<FStructOnScope> struct_scope = MakeShared<FStructOnScope>(ue_py_struct->u_struct, ue_py_struct->u_struct_ptr);
192192
FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
193193
new(&self->istructure_details_view) TSharedRef<IStructureDetailsView>(PropertyEditorModule.CreateStructureDetailView(view_args, struct_view_args, struct_scope));
194194

Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,7 @@ PyObject *py_unreal_engine_create_structure_detail_view(PyObject *self, PyObject
11901190
{
11911191
Py_INCREF(ue_py_struct);
11921192
ret->ue_py_struct = ue_py_struct;
1193-
struct_scope = MakeShared<FStructOnScope>(ue_py_struct->u_struct, ue_py_struct->data);
1193+
struct_scope = MakeShared<FStructOnScope>(ue_py_struct->u_struct, ue_py_struct->u_struct_ptr);
11941194
}
11951195

11961196
FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,7 +1368,7 @@ static PyObject *ue_PyUObject_call(ue_PyUObject *self, PyObject *args, PyObject
13681368
}
13691369
}
13701370
}
1371-
return py_ue_wrap_uscriptstruct(u_script_struct, data);
1371+
return py_ue_new_uscriptstruct(u_script_struct, data);
13721372
}
13731373
return PyErr_Format(PyExc_Exception, "the specified uobject has no __call__ support");
13741374
}
@@ -2472,7 +2472,7 @@ bool ue_py_convert_pyobject(PyObject *py_obj, UProperty *prop, uint8 *buffer, in
24722472
if (casted_prop->Struct == py_u_struct->u_struct)
24732473
{
24742474
uint8 *dest = casted_prop->ContainerPtrToValuePtr<uint8>(buffer, index);
2475-
FMemory::Memcpy(dest, py_u_struct->data, py_u_struct->u_struct->GetStructureSize());
2475+
FMemory::Memcpy(dest, py_u_struct->u_struct_ptr, py_u_struct->u_struct->GetStructureSize());
24762476
return true;
24772477
}
24782478
}
@@ -3288,7 +3288,7 @@ FGuid *ue_py_check_fguid(PyObject *py_obj)
32883288

32893289
if (ue_py_struct->u_struct == FindObject<UScriptStruct>(ANY_PACKAGE, UTF8_TO_TCHAR((char *)"Guid")))
32903290
{
3291-
return (FGuid*)ue_py_struct->data;
3291+
return (FGuid*)ue_py_struct->u_struct_ptr;
32923292
}
32933293

32943294
return nullptr;
@@ -3303,7 +3303,7 @@ uint8 * do_ue_py_check_struct(PyObject *py_obj, UScriptStruct* chk_u_struct)
33033303

33043304
if (ue_py_struct->u_struct == chk_u_struct)
33053305
{
3306-
return ue_py_struct->data;
3306+
return ue_py_struct->u_struct_ptr;
33073307
}
33083308

33093309
return nullptr;

Source/UnrealEnginePython/Private/UEPyUScriptStruct.cpp

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,7 @@ static PyObject *py_ue_uscriptstruct_get_struct(ue_PyUScriptStruct *self, PyObje
7878
Py_RETURN_UOBJECT(self->u_struct);
7979
}
8080

81-
static PyObject *py_ue_uscriptstruct_clone(ue_PyUScriptStruct *self, PyObject * args)
82-
{
83-
return py_ue_new_uscriptstruct(self->u_struct, self->u_struct_ptr);
84-
}
81+
static PyObject *py_ue_uscriptstruct_clone(ue_PyUScriptStruct *, PyObject *);
8582

8683
PyObject *py_ue_uscriptstruct_as_dict(ue_PyUScriptStruct * self, PyObject * args)
8784
{
@@ -98,7 +95,7 @@ PyObject *py_ue_uscriptstruct_as_dict(ue_PyUScriptStruct * self, PyObject * args
9895
TFieldIterator<UProperty> SArgs(self->u_struct);
9996
for (; SArgs; ++SArgs)
10097
{
101-
PyObject *struct_value = ue_py_convert_property(*SArgs, self->data, 0);
98+
PyObject *struct_value = ue_py_convert_property(*SArgs, self->u_struct_ptr, 0);
10299
if (!struct_value)
103100
{
104101
Py_DECREF(py_struct_dict);
@@ -143,7 +140,7 @@ static PyMethodDef ue_PyUScriptStruct_methods[] = {
143140
static PyObject *ue_PyUScriptStruct_str(ue_PyUScriptStruct *self)
144141
{
145142
return PyUnicode_FromFormat("<unreal_engine.UScriptStruct {'struct': '%s', 'size': %d, 'ptr': %p}>",
146-
TCHAR_TO_UTF8(*self->u_struct->GetName()), self->u_struct->GetStructureSize(), self->data);
143+
TCHAR_TO_UTF8(*self->u_struct->GetName()), self->u_struct->GetStructureSize(), self->u_struct_ptr);
147144
}
148145

149146
static UProperty *get_field_from_name(UScriptStruct *u_struct, char *name)
@@ -193,7 +190,7 @@ static PyObject *ue_PyUScriptStruct_getattro(ue_PyUScriptStruct *self, PyObject
193190
{
194191
// swallow previous exception
195192
PyErr_Clear();
196-
return ue_py_convert_property(u_property, self->data, 0);
193+
return ue_py_convert_property(u_property, self->u_struct_ptr, 0);
197194
}
198195
}
199196
}
@@ -210,7 +207,7 @@ static int ue_PyUScriptStruct_setattro(ue_PyUScriptStruct *self, PyObject *attr_
210207
UProperty *u_property = get_field_from_name(self->u_struct, (char *)attr);
211208
if (u_property)
212209
{
213-
if (ue_py_convert_pyobject(value, u_property, self->data, 0))
210+
if (ue_py_convert_pyobject(value, u_property, self->u_struct_ptr, 0))
214211
{
215212
return 0;
216213
}
@@ -229,9 +226,9 @@ static void ue_PyUScriptStruct_dealloc(ue_PyUScriptStruct *self)
229226
#if defined(UEPY_MEMORY_DEBUG)
230227
UE_LOG(LogPython, Warning, TEXT("Destroying ue_PyUScriptStruct %p with size %d"), self, self->u_struct->GetStructureSize());
231228
#endif
232-
if (!self->is_ptr)
229+
if (self->u_struct_owned)
233230
{
234-
FMemory::Free(self->data);
231+
FMemory::Free(self->u_struct_ptr);
235232
}
236233
Py_TYPE(self)->tp_free((PyObject *)self);
237234
}
@@ -289,25 +286,20 @@ static int ue_py_uscriptstruct_init(ue_PyUScriptStruct *self, PyObject *args, Py
289286
}
290287

291288
self->u_struct = (UScriptStruct *)py_u_obj->ue_object;
292-
self->data = (uint8*)FMemory::Malloc(self->u_struct->GetStructureSize());
293-
self->u_struct->InitializeStruct(self->data);
289+
self->u_struct_ptr = (uint8*)FMemory::Malloc(self->u_struct->GetStructureSize());
290+
self->u_struct->InitializeStruct(self->u_struct_ptr);
294291
#if WITH_EDITOR
295-
self->u_struct->InitializeDefaultValue(self->data);
292+
self->u_struct->InitializeDefaultValue(self->u_struct_ptr);
296293
#endif
297-
self->original_data = self->data;
298-
self->is_ptr = 0;
294+
self->u_struct_owned = 1;
299295
return 0;
300296
}
301297

302-
// get the original pointer of a struct
298+
// get the original pointer of a struct (dumb function for backward compatibility with older scripts from
299+
// a dark age where strctures were passed by value)
303300
static PyObject *py_ue_uscriptstruct_ref(ue_PyUScriptStruct *self, PyObject * args)
304301
{
305-
ue_PyUScriptStruct *ret = (ue_PyUScriptStruct *)PyObject_New(ue_PyUScriptStruct, &ue_PyUScriptStructType);
306-
ret->u_struct = self->u_struct;
307-
ret->data = self->original_data;
308-
ret->original_data = ret->data;
309-
ret->is_ptr = 1;
310-
return (PyObject *)ret;
302+
return (PyObject *)self;
311303
}
312304

313305
static PyObject *ue_py_uscriptstruct_richcompare(ue_PyUScriptStruct *u_struct1, PyObject *py_obj, int op)
@@ -318,7 +310,7 @@ static PyObject *ue_py_uscriptstruct_richcompare(ue_PyUScriptStruct *u_struct1,
318310
return PyErr_Format(PyExc_NotImplementedError, "can only compare with another UScriptStruct");
319311
}
320312

321-
bool equals = (u_struct1->u_struct == u_struct2->u_struct && !memcmp(u_struct1->data, u_struct2->data, u_struct1->u_struct->GetStructureSize()));
313+
bool equals = (u_struct1->u_struct == u_struct2->u_struct && !memcmp(u_struct1->u_struct_ptr, u_struct2->u_struct_ptr, u_struct1->u_struct->GetStructureSize()));
322314

323315
if (op == Py_EQ)
324316
{
@@ -358,23 +350,20 @@ PyObject *py_ue_new_uscriptstruct(UScriptStruct *u_struct, uint8 *data)
358350
{
359351
ue_PyUScriptStruct *ret = (ue_PyUScriptStruct *)PyObject_New(ue_PyUScriptStruct, &ue_PyUScriptStructType);
360352
ret->u_struct = u_struct;
361-
uint8 *struct_data = (uint8*)FMemory::Malloc(u_struct->GetStructureSize());
362-
ret->u_struct->InitializeStruct(struct_data);
363-
ret->u_struct->CopyScriptStruct(struct_data, data);
364-
ret->data = struct_data;
365-
ret->original_data = data;
366-
ret->is_ptr = 0;
353+
ret->u_struct_ptr = data;
354+
ret->u_struct_owned = 0;
367355
return (PyObject *)ret;
368356
}
369357

370-
// generate a new python UScriptStruct from an already allocated data block
371-
PyObject *py_ue_wrap_uscriptstruct(UScriptStruct *u_struct, uint8 *data)
358+
static PyObject *py_ue_uscriptstruct_clone(ue_PyUScriptStruct *self, PyObject * args)
372359
{
373360
ue_PyUScriptStruct *ret = (ue_PyUScriptStruct *)PyObject_New(ue_PyUScriptStruct, &ue_PyUScriptStructType);
374-
ret->u_struct = u_struct;
375-
ret->data = data;
376-
ret->original_data = data;
377-
ret->is_ptr = 0;
361+
ret->u_struct = self->u_struct;
362+
uint8 *struct_data = (uint8*)FMemory::Malloc(self->u_struct->GetStructureSize());
363+
ret->u_struct->InitializeStruct(struct_data);
364+
ret->u_struct->CopyScriptStruct(struct_data, self->u_struct_ptr);
365+
ret->u_struct_ptr = struct_data;
366+
ret->u_struct_owned = 1;
378367
return (PyObject *)ret;
379368
}
380369

Source/UnrealEnginePython/Private/UEPyUScriptStruct.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,11 @@ typedef struct
88
/* Type-specific fields go here. */
99
UScriptStruct *u_struct;
1010
uint8 *u_struct_ptr;
11-
// points to the original struct memory (do not try this at home !)
12-
uint8 *original_ptr;
1311
// if set, the struct is responsible for freeing memory
1412
int u_struct_owned;
1513
} ue_PyUScriptStruct;
1614

1715
PyObject *py_ue_new_uscriptstruct(UScriptStruct *, uint8 *);
18-
PyObject *py_ue_wrap_uscriptstruct(UScriptStruct *, uint8 *);
1916
ue_PyUScriptStruct *py_ue_is_uscriptstruct(PyObject *);
2017

2118
UProperty *ue_struct_get_field_from_name(UScriptStruct *, char *);

0 commit comments

Comments
 (0)