diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-04-30 00:21:19 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-04-30 00:21:19 +0400 |
commit | 1edf56e7a5998b5f2efdb4f96883556923376eb6 (patch) | |
tree | 27bf80d9d1009184c2eb86cbd385c98155753eb9 /source/blender/python/bmesh | |
parent | aa2a0e4ab00a803743141af258a1ff1515182420 (diff) |
fix [#35150] Crash when bmesh operation called from within a Panel draw()
accessing a bmesh from python would reallocate all customdata layers.
add an assert to BM_data_layer_free(), when its called unnecessarily since its reallocating all layers.
Diffstat (limited to 'source/blender/python/bmesh')
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_types.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index fc69f81820a..3da47d22d90 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -2943,10 +2943,10 @@ static void bpy_bmesh_dealloc(BPy_BMesh *self) if (bm) { bm_dealloc_editmode_warn(self); - BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR); - BM_data_layer_free(bm, &bm->edata, CD_BM_ELEM_PYPTR); - BM_data_layer_free(bm, &bm->pdata, CD_BM_ELEM_PYPTR); - BM_data_layer_free(bm, &bm->ldata, CD_BM_ELEM_PYPTR); + if (CustomData_has_layer(&bm->vdata, CD_BM_ELEM_PYPTR)) BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR); + if (CustomData_has_layer(&bm->edata, CD_BM_ELEM_PYPTR)) BM_data_layer_free(bm, &bm->edata, CD_BM_ELEM_PYPTR); + if (CustomData_has_layer(&bm->pdata, CD_BM_ELEM_PYPTR)) BM_data_layer_free(bm, &bm->pdata, CD_BM_ELEM_PYPTR); + if (CustomData_has_layer(&bm->ldata, CD_BM_ELEM_PYPTR)) BM_data_layer_free(bm, &bm->ldata, CD_BM_ELEM_PYPTR); bm->py_handle = NULL; @@ -3370,10 +3370,13 @@ PyObject *BPy_BMesh_CreatePyObject(BMesh *bm, int flag) bm->py_handle = self; /* point back */ + /* avoid allocating layers when we don't have to */ +#if 0 BM_data_layer_add(bm, &bm->vdata, CD_BM_ELEM_PYPTR); BM_data_layer_add(bm, &bm->edata, CD_BM_ELEM_PYPTR); BM_data_layer_add(bm, &bm->pdata, CD_BM_ELEM_PYPTR); BM_data_layer_add(bm, &bm->ldata, CD_BM_ELEM_PYPTR); +#endif } return (PyObject *)self; |