fix bug [#30426] crash in bmesh python api.
if blender freed the BMesh before python was finished (on exit editmode for eg), python would attempt to access the bmesh to clear python pointers in it.
This commit is contained in:
@@ -154,6 +154,13 @@ void BM_mesh_data_free(BMesh *bm)
|
|||||||
|
|
||||||
BLI_freelistN(&bm->selected);
|
BLI_freelistN(&bm->selected);
|
||||||
|
|
||||||
|
if (bm->py_handle) {
|
||||||
|
extern void bpy_bm_generic_invalidate(void *self);
|
||||||
|
|
||||||
|
bpy_bm_generic_invalidate(bm->py_handle);
|
||||||
|
bm->py_handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
BMO_error_clear(bm);
|
BMO_error_clear(bm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2040,12 +2040,15 @@ static void bpy_bmesh_dealloc(BPy_BMesh *self)
|
|||||||
{
|
{
|
||||||
BMesh *bm = self->bm;
|
BMesh *bm = self->bm;
|
||||||
|
|
||||||
BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR);
|
/* have have been freed by bmesh */
|
||||||
BM_data_layer_free(bm, &bm->edata, CD_BM_ELEM_PYPTR);
|
if (bm) {
|
||||||
BM_data_layer_free(bm, &bm->pdata, CD_BM_ELEM_PYPTR);
|
BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR);
|
||||||
BM_data_layer_free(bm, &bm->ldata, 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);
|
||||||
|
|
||||||
bm->py_handle = NULL;
|
bm->py_handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
PyObject_DEL(self);
|
PyObject_DEL(self);
|
||||||
}
|
}
|
||||||
@@ -2384,6 +2387,7 @@ PyObject *BPy_BMesh_CreatePyObject(BMesh *bm)
|
|||||||
else {
|
else {
|
||||||
self = PyObject_New(BPy_BMesh, &BPy_BMesh_Type);
|
self = PyObject_New(BPy_BMesh, &BPy_BMesh_Type);
|
||||||
self->bm = bm;
|
self->bm = bm;
|
||||||
|
bm->py_handle = self; /* point back */
|
||||||
|
|
||||||
BM_data_layer_add(bm, &bm->vdata, CD_BM_ELEM_PYPTR);
|
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->edata, CD_BM_ELEM_PYPTR);
|
||||||
|
|||||||
Reference in New Issue
Block a user