@@ -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
8683PyObject *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[] = {
143140static 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
149146static 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)
303300static 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
313305static 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
0 commit comments