forked from bartvdbraak/blender
Fix RNA parameter passing issue with dynamic arrays, was computing the wrong
size in some cases.
This commit is contained in:
parent
48ae40ccdf
commit
33686720f2
@ -2292,7 +2292,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dparm->next)
|
if (dparm->next)
|
||||||
fprintf(f, "\t_data += %d;\n", rna_parameter_size_alloc(dparm->prop));
|
fprintf(f, "\t_data += %d;\n", rna_parameter_size(dparm->prop));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dfunc->call) {
|
if (dfunc->call) {
|
||||||
|
@ -5378,7 +5378,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
|
|||||||
|
|
||||||
/* allocate data */
|
/* allocate data */
|
||||||
for (parm = func->cont.properties.first; parm; parm = parm->next) {
|
for (parm = func->cont.properties.first; parm; parm = parm->next) {
|
||||||
alloc_size += rna_parameter_size_alloc(parm);
|
alloc_size += rna_parameter_size(parm);
|
||||||
|
|
||||||
if (parm->flag & PROP_OUTPUT)
|
if (parm->flag & PROP_OUTPUT)
|
||||||
parms->ret_count++;
|
parms->ret_count++;
|
||||||
@ -5440,7 +5440,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data = ((char *)data) + rna_parameter_size_alloc(parm);
|
data = ((char *)data) + rna_parameter_size(parm);
|
||||||
}
|
}
|
||||||
|
|
||||||
return parms;
|
return parms;
|
||||||
@ -5462,7 +5462,7 @@ void RNA_parameter_list_free(ParameterList *parms)
|
|||||||
MEM_freeN(data_alloc->array);
|
MEM_freeN(data_alloc->array);
|
||||||
}
|
}
|
||||||
|
|
||||||
tot += rna_parameter_size_alloc(parm);
|
tot += rna_parameter_size(parm);
|
||||||
}
|
}
|
||||||
|
|
||||||
MEM_freeN(parms->data);
|
MEM_freeN(parms->data);
|
||||||
@ -5497,7 +5497,7 @@ void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
|
|||||||
iter->offset = 0;
|
iter->offset = 0;
|
||||||
|
|
||||||
if (iter->valid) {
|
if (iter->valid) {
|
||||||
iter->size = rna_parameter_size_alloc(iter->parm);
|
iter->size = rna_parameter_size(iter->parm);
|
||||||
iter->data = (((char *)iter->parms->data)); /* +iter->offset, always 0 */
|
iter->data = (((char *)iter->parms->data)); /* +iter->offset, always 0 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5509,7 +5509,7 @@ void RNA_parameter_list_next(ParameterIterator *iter)
|
|||||||
iter->valid = iter->parm != NULL;
|
iter->valid = iter->parm != NULL;
|
||||||
|
|
||||||
if (iter->valid) {
|
if (iter->valid) {
|
||||||
iter->size = rna_parameter_size_alloc(iter->parm);
|
iter->size = rna_parameter_size(iter->parm);
|
||||||
iter->data = (((char *)iter->parms->data) + iter->offset);
|
iter->data = (((char *)iter->parms->data) + iter->offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3039,13 +3039,13 @@ void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
|
|||||||
int rna_parameter_size(PropertyRNA *parm)
|
int rna_parameter_size(PropertyRNA *parm)
|
||||||
{
|
{
|
||||||
PropertyType ptype = parm->type;
|
PropertyType ptype = parm->type;
|
||||||
int len = parm->totarraylength; /* only supports fixed length at the moment */
|
int len = parm->totarraylength;
|
||||||
|
|
||||||
|
/* XXX in other parts is mentioned that strings can be dynamic as well */
|
||||||
|
if (parm->flag & PROP_DYNAMIC)
|
||||||
|
return sizeof(ParameterDynAlloc);
|
||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
/* XXX in other parts is mentioned that strings can be dynamic as well */
|
|
||||||
if (parm->flag & PROP_DYNAMIC)
|
|
||||||
return sizeof(void *);
|
|
||||||
|
|
||||||
switch (ptype) {
|
switch (ptype) {
|
||||||
case PROP_BOOLEAN:
|
case PROP_BOOLEAN:
|
||||||
case PROP_INT:
|
case PROP_INT:
|
||||||
@ -3106,18 +3106,6 @@ int rna_parameter_size(PropertyRNA *parm)
|
|||||||
return sizeof(void *);
|
return sizeof(void *);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this function returns the size of the memory allocated for the parameter,
|
|
||||||
* useful for instance for memory alignment or for storing additional information */
|
|
||||||
int rna_parameter_size_alloc(PropertyRNA *parm)
|
|
||||||
{
|
|
||||||
int size = rna_parameter_size(parm);
|
|
||||||
|
|
||||||
if (parm->flag & PROP_DYNAMIC)
|
|
||||||
size += sizeof(((ParameterDynAlloc *)NULL)->array_tot);
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dynamic Enums */
|
/* Dynamic Enums */
|
||||||
|
|
||||||
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
|
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
|
||||||
|
@ -402,7 +402,6 @@ PointerRNA rna_pointer_inherit_refine(struct PointerRNA *ptr, struct StructRNA *
|
|||||||
/* Functions */
|
/* Functions */
|
||||||
|
|
||||||
int rna_parameter_size(struct PropertyRNA *parm);
|
int rna_parameter_size(struct PropertyRNA *parm);
|
||||||
int rna_parameter_size_alloc(struct PropertyRNA *parm);
|
|
||||||
|
|
||||||
struct Mesh *rna_Main_meshes_new_from_object(
|
struct Mesh *rna_Main_meshes_new_from_object(
|
||||||
struct Main *bmain, struct ReportList *reports, struct Scene *sce,
|
struct Main *bmain, struct ReportList *reports, struct Scene *sce,
|
||||||
|
Loading…
Reference in New Issue
Block a user