diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-02-16 22:38:03 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-02-16 22:38:03 +0400 |
commit | 92436c94d3adbbfc285bd7b3041db36e66dae5d5 (patch) | |
tree | 2083c8ad4fa810a781e9631161aa88b12008453d /source/blender/python/bmesh/bmesh_py_types.c | |
parent | 90ed5ea4ea278b4aadf9187e4e2b92ef3221001b (diff) | |
parent | fda8927d01ba719963154a56b45952ee541a869d (diff) |
Merged changes in the trunk up to revision 54594.
Diffstat (limited to 'source/blender/python/bmesh/bmesh_py_types.c')
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_types.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 0abff03da46..b95db945eb1 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -50,6 +50,8 @@ #include "bmesh_py_types_customdata.h" #include "bmesh_py_types_meshdata.h" +static void bm_dealloc_editmode_warn(BPy_BMesh *self); + /* Common Flags * ************ */ @@ -847,6 +849,8 @@ static PyObject *bpy_bmesh_free(BPy_BMesh *self) if (self->bm) { BMesh *bm = self->bm; + bm_dealloc_editmode_warn(self); + if ((self->flag & BPY_BMFLAG_IS_WRAPPED) == 0) { BM_mesh_free(bm); } @@ -2828,6 +2832,8 @@ static void bpy_bmesh_dealloc(BPy_BMesh *self) /* have have been freed by bmesh */ 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); @@ -3638,3 +3644,51 @@ char *BPy_BMElem_StringFromHType(const char htype) static char ret[32]; return BPy_BMElem_StringFromHType_ex(htype, ret); } + + +/* -------------------------------------------------------------------- */ +/* keep at bottom */ +/* BAD INCLUDES */ + +#include "BKE_global.h" +#include "BKE_main.h" +#include "BKE_tessmesh.h" +#include "DNA_scene_types.h" +#include "DNA_object_types.h" +#include "DNA_mesh_types.h" +#include "MEM_guardedalloc.h" + +/* there are cases where this warning isnt needed, otherwise it could be made into an error */ +static void bm_dealloc_warn(const char *mesh_name) +{ + PySys_WriteStdout("Modified BMesh '%.200s' from a wrapped editmesh is freed without a call " + "to bmesh.update_edit_mesh(mesh, destructive=True), this is will likely cause a crash\n", + mesh_name); +} + +/* this function is called on free, it should stay quite fast */ +static void bm_dealloc_editmode_warn(BPy_BMesh *self) +{ + if (self->flag & BPY_BMFLAG_IS_WRAPPED) { + /* likely editmesh */ + BMesh *bm = self->bm; + Scene *scene; + for (scene = G.main->scene.first; scene; scene = scene->id.next) { + Base *base = scene->basact; + if (base && base->object->type == OB_MESH) { + Mesh *me = base->object->data; + BMEditMesh *em = me->edit_btmesh; + if (em && em->bm == bm) { + /* not foolproof, scripter may have added/removed verts */ + if (((em->vert_index && (MEM_allocN_len(em->vert_index) / sizeof(*em->vert_index)) != bm->totvert)) || + ((em->edge_index && (MEM_allocN_len(em->edge_index) / sizeof(*em->edge_index)) != bm->totedge)) || + ((em->face_index && (MEM_allocN_len(em->face_index) / sizeof(*em->face_index)) != bm->totface))) + { + bm_dealloc_warn(me->id.name + 2); + break; + } + } + } + } + } +} |