Fix T90972: Crash calling Mesh.clear_geometry in edit-mode

No longer free the edit-mesh pointer while in edit-mode since this
isn't reliable to keep the object in edit-mode while freeing it's
edit-mesh data.

Users who want to exit edit-mode should do so explicitly.

Caused by 6d2f9b1dfa.
This commit is contained in:
Campbell Barton 2021-09-02 15:29:36 +10:00
parent 0708733c46
commit 19e1b5c1fd
Notes: blender-bot 2023-02-13 22:38:46 +01:00
Referenced by issue #90972, Crash calling Mesh.clear_geometry in edit-mode
1 changed files with 12 additions and 5 deletions

View File

@ -886,6 +886,18 @@ void BKE_mesh_free_data_for_undo(Mesh *me)
mesh_free_data(&me->id);
}
/**
* \note on data that this function intentionally doesn't free:
*
* - Materials and shape keys are not freed here (#Mesh.mat & #Mesh.key).
* As freeing shape keys requires tagging the depsgraph for updated relations,
* which is expensive.
* Material slots should be kept in sync with the object.
*
* - Edit-Mesh (#Mesh.edit_mesh)
* Since edit-mesh is tied to the objects mode,
* which crashes when called in edit-mode, see: T90972.
*/
static void mesh_clear_geometry(Mesh *mesh)
{
CustomData_free(&mesh->vdata, mesh->totvert);
@ -895,11 +907,6 @@ static void mesh_clear_geometry(Mesh *mesh)
CustomData_free(&mesh->pdata, mesh->totpoly);
MEM_SAFE_FREE(mesh->mselect);
MEM_SAFE_FREE(mesh->edit_mesh);
/* Note that materials and shape keys are not freed here. This is intentional, as freeing
* shape keys requires tagging the depsgraph for updated relations, which is expensive.
* Material slots should be kept in sync with the object. */
mesh->totvert = 0;
mesh->totedge = 0;