diff --git a/source/blender/makesrna/intern/makesrna.cc b/source/blender/makesrna/intern/makesrna.cc index 825935b388f..e8795b27511 100644 --- a/source/blender/makesrna/intern/makesrna.cc +++ b/source/blender/makesrna/intern/makesrna.cc @@ -3433,12 +3433,20 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA (dparm->prop->arraydimension)) ? "*" : ""; - fprintf(f, - "\t*((%s%s %s*)_retdata) = %s;\n", - rna_type_struct(dparm->prop), - rna_parameter_type_name(dparm->prop), - ptrstr, - func->c_ret->identifier); + if (dparm->prop->type == PROP_COLLECTION) { + /* Placement new is necessary because #ParameterList::data is not initialized. */ + fprintf(f, + "\tnew ((CollectionVector *)_retdata) CollectionVector(std::move(%s));\n", + func->c_ret->identifier); + } + else { + fprintf(f, + "\t*((%s%s %s*)_retdata) = %s;\n", + rna_type_struct(dparm->prop), + rna_parameter_type_name(dparm->prop), + ptrstr, + func->c_ret->identifier); + } } } } diff --git a/source/blender/makesrna/intern/rna_access.cc b/source/blender/makesrna/intern/rna_access.cc index 9c028ed8b5a..f97af69042f 100644 --- a/source/blender/makesrna/intern/rna_access.cc +++ b/source/blender/makesrna/intern/rna_access.cc @@ -6403,7 +6403,8 @@ void RNA_parameter_list_free(ParameterList *parms) void *data = parms->data; for (; parm; parm = parm->next) { if (parm->type == PROP_COLLECTION) { - BLI_freelistN(static_cast(data)); + CollectionVector *vector = static_cast(data); + vector->~CollectionVector(); } else if ((parm->flag_parameter & PARM_RNAPTR) && (parm->flag & PROP_THICK_WRAP)) { BLI_assert(parm->type == PROP_POINTER); diff --git a/source/blender/makesrna/intern/rna_define.cc b/source/blender/makesrna/intern/rna_define.cc index 87350abc6b1..f2ec85aaed1 100644 --- a/source/blender/makesrna/intern/rna_define.cc +++ b/source/blender/makesrna/intern/rna_define.cc @@ -4699,7 +4699,7 @@ int rna_parameter_size(PropertyRNA *parm) #endif } case PROP_COLLECTION: - return sizeof(ListBase); + return sizeof(CollectionVector); } }