From c84383301c5a2582e95259a7e4468a23a3566401 Mon Sep 17 00:00:00 2001 From: Sergej Reich Date: Sat, 26 Jan 2013 17:38:45 +0000 Subject: Fix [#34005] blender will close immediately in debug mode on deleting objects Was silly mistake from rigidbody merge, base was used after it's been freed. Now don't free base in BKE_scene_base_remove() and rename it to BKE_scene_base_unlink(). --- source/blender/blenkernel/BKE_scene.h | 2 +- source/blender/blenkernel/intern/scene.c | 3 +-- source/blender/editors/object/object_add.c | 3 ++- source/blender/editors/object/object_relations.c | 3 ++- source/blender/makesrna/intern/rna_scene.c | 3 ++- 5 files changed, 8 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 2ac32a3f651..9bf0991272a 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -72,7 +72,7 @@ struct Scene *BKE_scene_add(struct Main *bmain, const char *name); /* base functions */ struct Base *BKE_scene_base_find(struct Scene *scene, struct Object *ob); struct Base *BKE_scene_base_add(struct Scene *sce, struct Object *ob); -void BKE_scene_base_remove(struct Scene *sce, struct Base *base); +void BKE_scene_base_unlink(struct Scene *sce, struct Base *base); void BKE_scene_base_deselect_all(struct Scene *sce); void BKE_scene_base_select(struct Scene *sce, struct Base *selbase); int BKE_scene_base_iter_next(struct Scene **scene, int val, struct Base **base, struct Object **ob); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index fa3dac67a7f..9e8cf985f71 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -941,7 +941,7 @@ Base *BKE_scene_base_add(Scene *sce, Object *ob) return b; } -void BKE_scene_base_remove(Scene *sce, Base *base) +void BKE_scene_base_unlink(Scene *sce, Base *base) { /* remove rigid body constraint from world before removing object */ if (base->object->rigidbody_constraint) @@ -951,7 +951,6 @@ void BKE_scene_base_remove(Scene *sce, Base *base) BKE_rigidbody_remove_object(sce, base->object); BLI_remlink(&sce->base, base); - MEM_freeN(base); } void BKE_scene_base_deselect_all(Scene *sce) diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 9c829a06cd2..8457b278c6c 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -941,10 +941,11 @@ static void object_delete_check_glsl_update(Object *ob) void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base) { DAG_id_type_tag(bmain, ID_OB); - BKE_scene_base_remove(scene, base); + BKE_scene_base_unlink(scene, base); object_delete_check_glsl_update(base->object); BKE_libblock_free_us(&bmain->object, base->object); if (scene->basact == base) scene->basact = NULL; + MEM_freeN(base); } static int object_delete_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 68d7dcafd9c..9749494bc66 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -354,7 +354,8 @@ static int make_proxy_exec(bContext *C, wmOperator *op) /* remove base, leave user count of object, it gets linked in BKE_object_make_proxy */ if (gob == NULL) { - BKE_scene_base_remove(scene, oldbase); + BKE_scene_base_unlink(scene, oldbase); + MEM_freeN(oldbase); } BKE_object_make_proxy(newob, ob, gob); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 705ac09382d..7304f7c9a49 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -406,7 +406,8 @@ static void rna_Scene_object_unlink(Scene *scene, ReportList *reports, Object *o scene->basact = NULL; } - BKE_scene_base_remove(scene, base); + BKE_scene_base_unlink(scene, base); + MEM_freeN(base); ob->id.us--; -- cgit v1.2.3