[Bf-blender-cvs] [e75db0e61bd] id_copy_refactor: Fix several crashes and other issues in new ID copying code.

Bastien Montagne noreply at git.blender.org
Tue Jul 11 15:58:03 CEST 2017


Commit: e75db0e61bd057f0aaf36b21a07816ffadb6a239
Author: Bastien Montagne
Date:   Tue Jul 11 14:16:04 2017 +0200
Branches: id_copy_refactor
https://developer.blender.org/rBe75db0e61bd057f0aaf36b21a07816ffadb6a239

Fix several crashes and other issues in new ID copying code.

Mostly in core and animdata area. Code should now also be more robust,
and slightly simpler & cleaner.

===================================================================

M	source/blender/blenkernel/BKE_animsys.h
M	source/blender/blenkernel/BKE_library.h
M	source/blender/blenkernel/intern/anim_sys.c
M	source/blender/blenkernel/intern/library.c
M	source/blender/editors/armature/armature_relations.c
M	source/blender/editors/object/object_relations.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index 147bdc84e4a..534a57765f6 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -67,10 +67,10 @@ bool BKE_animdata_set_action(struct ReportList *reports, struct ID *id, struct b
 void BKE_animdata_free(struct ID *id, const bool do_id_user);
 
 /* Copy AnimData */
-struct AnimData *BKE_animdata_copy(struct AnimData *adt, const bool do_action);
+struct AnimData *BKE_animdata_copy(struct Main *bmain, struct AnimData *adt, const bool do_action);
 
 /* Copy AnimData */
-bool BKE_animdata_copy_id(struct ID *id_to, struct ID *id_from, const bool do_action);
+bool BKE_animdata_copy_id(struct Main *bmain, struct ID *id_to, struct ID *id_from, const bool do_action);
 
 /* Copy AnimData Actions */
 void BKE_animdata_copy_id_action(struct ID *id, const bool set_newid);
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index b5d92f98bfa..004442fb013 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -84,7 +84,7 @@ void *BKE_libblock_copy(struct Main *bmain, const struct ID *id) ATTR_WARN_UNUSE
 /* "Deprecated" old API. */
 void *BKE_libblock_copy_nolib(const struct ID *id, const bool do_action) ATTR_NONNULL();
 
-void  BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const int flag);
+void  BKE_libblock_copy_data(struct Main *bmain, struct ID *id, const struct ID *id_from, const int flag);
 
 void  BKE_libblock_rename(struct Main *bmain, struct ID *id, const char *name) ATTR_NONNULL();
 void  BLI_libblock_ensure_unique_name(struct Main *bmain, const char *name) ATTR_NONNULL();
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 23ae5a69843..6afa251bce7 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -259,7 +259,7 @@ void BKE_animdata_free(ID *id, const bool do_id_user)
 /* Copying -------------------------------------------- */
 
 /* Make a copy of the given AnimData - to be used when copying datablocks */
-AnimData *BKE_animdata_copy(AnimData *adt, const bool do_action)
+AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const bool do_action)
 {
 	AnimData *dadt;
 	
@@ -270,8 +270,9 @@ AnimData *BKE_animdata_copy(AnimData *adt, const bool do_action)
 	
 	/* make a copy of action - at worst, user has to delete copies... */
 	if (do_action) {
-		dadt->action = BKE_action_copy(G.main, adt->action);
-		dadt->tmpact = BKE_action_copy(G.main, adt->tmpact);
+		BLI_assert(bmain != NULL);
+		BKE_id_copy_ex(bmain, (ID *)dadt->action, (ID **)&dadt->action, 0, false);
+		BKE_id_copy_ex(bmain, (ID *)dadt->tmpact, (ID **)&dadt->tmpact, 0, false);
 	}
 	else {
 		id_us_plus((ID *)dadt->action);
@@ -291,7 +292,7 @@ AnimData *BKE_animdata_copy(AnimData *adt, const bool do_action)
 	return dadt;
 }
 
-bool BKE_animdata_copy_id(ID *id_to, ID *id_from, const bool do_action)
+bool BKE_animdata_copy_id(Main *bmain, ID *id_to, ID *id_from, const bool do_action)
 {
 	AnimData *adt;
 
@@ -303,7 +304,7 @@ bool BKE_animdata_copy_id(ID *id_to, ID *id_from, const bool do_action)
 	adt = BKE_animdata_from_id(id_from);
 	if (adt) {
 		IdAdtTemplate *iat = (IdAdtTemplate *)id_to;
-		iat->adt = BKE_animdata_copy(adt, do_action);
+		iat->adt = BKE_animdata_copy(bmain, adt, do_action);
 	}
 
 	return true;
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index c5d816328a1..f288e963a2a 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -526,121 +526,130 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
 #define LIB_ID_TYPES_NOCOPY ID_LI, ID_SCR, ID_WM,  /* Not supported */ \
                             ID_IP  /* Deprecated */
 
-	if (ELEM(GS(id->name), LIB_ID_TYPES_NOCOPY)) {
+	BLI_assert(test || (r_newid != NULL));
+	if (r_newid != NULL) {
+		*r_newid = NULL;
+	}
+	if (id == NULL) {
 		return false;
 	}
 
-	if (!test) {
-		BKE_libblock_copy_ex(bmain, id, r_newid, flag);
+	if (ELEM(GS(id->name), LIB_ID_TYPES_NOCOPY)) {
+		return false;
 	}
+	else if (test) {
+		return true;
+	}
+
+	BKE_libblock_copy_ex(bmain, id, r_newid, flag);
 
 	switch ((ID_Type)GS(id->name)) {
 		case ID_SCE:
-			if (!test) BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag);
+			BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag);
 			break;
 		case ID_OB:
-			if (!test) BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag);
+			BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag);
 			break;
 		case ID_ME:
-			if (!test) BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag);
+			BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag);
 			break;
 		case ID_CU:
-			if (!test) BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag);
+			BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag);
 			break;
 		case ID_MB:
-			if (!test) BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag);
+			BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag);
 			break;
 		case ID_MA:
-			if (!test) BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag);
+			BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag);
 			break;
 		case ID_TE:
-			if (!test) BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag);
+			BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag);
 			break;
 		case ID_IM:
-			if (!test) BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag);
+			BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag);
 			break;
 		case ID_LT:
-			if (!test) BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag);
+			BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag);
 			break;
 		case ID_LA:
-			if (!test) BKE_lamp_copy_data(bmain, (Lamp *)*r_newid, (Lamp *)id, flag);
+			BKE_lamp_copy_data(bmain, (Lamp *)*r_newid, (Lamp *)id, flag);
 			break;
 		case ID_SPK:
-			if (!test) BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag);
+			BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag);
 			break;
 		case ID_CA:
-			if (!test) BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag);
+			BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag);
 			break;
 		case ID_KE:
-			if (!test) BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag);
+			BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag);
 			break;
 		case ID_WO:
-			if (!test) BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag);
+			BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag);
 			break;
 		case ID_TXT:
-			if (!test) BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag);
+			BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag);
 			break;
 		case ID_GR:
-			if (!test) BKE_group_copy_data(bmain, (Group *)*r_newid, (Group *)id, flag);
+			BKE_group_copy_data(bmain, (Group *)*r_newid, (Group *)id, flag);
 			break;
 		case ID_AR:
-			if (!test) BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag);
+			BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag);
 			break;
 		case ID_AC:
-			if (!test) BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag);
+			BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag);
 			break;
 		case ID_NT:
-			if (!test) BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag);
+			BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag);
 			break;
 		case ID_BR:
-			if (!test) BKE_brush_copy_data(bmain, (Brush *)*r_newid, (Brush *)id, flag);
+			BKE_brush_copy_data(bmain, (Brush *)*r_newid, (Brush *)id, flag);
 			break;
 		case ID_PA:
-			if (!test) BKE_particlesettings_copy_data(bmain, (ParticleSettings *)*r_newid, (ParticleSettings *)id, flag);
+			BKE_particlesettings_copy_data(bmain, (ParticleSettings *)*r_newid, (ParticleSettings *)id, flag);
 			break;
 		case ID_GD:
-			if (!test) BKE_gpencil_copy_data(bmain, (bGPdata *)*r_newid, (bGPdata *)id, flag);
+			BKE_gpencil_copy_data(bmain, (bGPdata *)*r_newid, (bGPdata *)id, flag);
 			break;
 		case ID_MC:
-			if (!test) BKE_movieclip_copy_data(bmain, (MovieClip *)*r_newid, (MovieClip *)id, flag);
+			BKE_movieclip_copy_data(bmain, (MovieClip *)*r_newid, (MovieClip *)id, flag);
 			break;
 		case ID_MSK:
-			if (!test) BKE_mask_copy_data(bmain, (Mask *)*r_newid, (Mask *)id, flag);
+			BKE_mask_copy_data(bmain, (Mask *)*r_newid, (Mask *)id, flag);
 			break;
 		case ID_LS:
-			if (!test) BKE_linestyle_copy_data(bmain, (FreestyleLineStyle *)*r_newid, (FreestyleLineStyle *)id, flag);
+			BKE_linestyle_copy_data(bmain, (FreestyleLineStyle *)*r_newid, (FreestyleLineStyle *)id, flag);
 			break;
 		case ID_PAL:
-			if (!test) BKE_palette_copy_data(bmain, (Palette *)*r_newid, (Palette *)id, flag);
+			BKE_palette_copy_data(bmain, (Palette *)*r_newid, (Palette *)id, flag);
 			break;
 		case ID_PC:
-			if (!test) BKE_paint_curve_copy_data(bmain, (PaintCurve *)*r_newid, (PaintCurve *)id, flag);
+			BKE_paint_curve_copy_data(bmain, (PaintCurve *)*r_newid, (PaintCurve *)id, flag);
 			break;
 		case ID_CF:
-			if (!test) BKE_cachefile_copy_data(bmain, (CacheFile *)*r_newid, (CacheFile *)id, flag);
+			BKE_cachefile_copy_data(bmain, (CacheFile *)*r_newid, (CacheFile *)id, flag);
 			break;
 		case ID_SO:
-			if (!test) BKE_sound_copy_data(bmain, (bSound *)*r_newid, (bSound *)id, flag);
+			BKE_sound_copy_data(bmain, (bSound *)*r_newid, (bSound *)id, flag);
 			break;
 		case ID_VF:
-			if (!test) BKE_vfont_copy_data(bmain, (VFont *)*r_newid, (VFont *)id, flag);
+			BKE_vfont_copy_data(bmain, (VFont *)*r_newid, (VFont *)id, flag);
 			break;
 		case ID_LI:
 		case ID_SCR:
 		case ID_WM:
 		case ID_IP:
 			BLI_assert(0);  /* Should have been rejected at start of function! */
-			return false;
+			break;
 	}
 
-	if (!test) {
-		/* U

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list