Cleanup old special cases from some libquery callbacks.
authorBastien Montagne <b.mont29@gmail.com>
Thu, 13 Feb 2020 13:26:27 +0000 (14:26 +0100)
committerBastien Montagne <b.mont29@gmail.com>
Thu, 13 Feb 2020 15:23:42 +0000 (16:23 +0100)
We now have proper flagging for horrible loopback pointers...

source/blender/blenloader/intern/readfile.c
source/blender/python/intern/bpy_rna_id_collection.c

index b06571e5f407ab11054d91eac1283f8b14441fc0..93352a1ec90ff5b9ae433190693f0c20961d804a 100644 (file)
@@ -7758,6 +7758,9 @@ static int lib_link_main_data_restore_cb(LibraryIDLinkCallbackData *cb_data)
   if (GS((*id_pointer)->name) == ID_GR) {
     Collection *collection = (Collection *)*id_pointer;
     if (collection->flag & COLLECTION_IS_MASTER) {
+      /* We should never reach that point anymore, since master collection private ID should be
+       * properly tagged with IDWALK_CB_PRIVATE. */
+      BLI_assert(0);
       return IDWALK_RET_NOP;
     }
   }
index 6084f3f3ad929797479c4b6f7b19afeed4918c32..ce47f5e4f65db4256076150d95290616d0982908 100644 (file)
@@ -84,11 +84,11 @@ static bool id_check_type(const ID *id, const BLI_bitmap *types_bitmap)
 
 static int foreach_libblock_id_user_map_callback(LibraryIDLinkCallbackData *cb_data)
 {
-  IDUserMapData *data = cb_data->user_data;
-  ID *self_id = cb_data->id_self;
   ID **id_p = cb_data->id_pointer;
 
   if (*id_p) {
+    IDUserMapData *data = cb_data->user_data;
+    const int cb_flag = cb_data->cb_flag;
 
     if (data->types_bitmap) {
       if (!id_check_type(*id_p, data->types_bitmap)) {
@@ -96,13 +96,8 @@ static int foreach_libblock_id_user_map_callback(LibraryIDLinkCallbackData *cb_d
       }
     }
 
-    if ((GS(self_id->name) == ID_OB) && (id_p == (ID **)&((Object *)self_id)->proxy_from)) {
-      /* We skip proxy_from here,
-       * since it's some internal pointer which is not relevant info for py/API level. */
-      return IDWALK_RET_NOP;
-    }
-    else if ((GS(self_id->name) == ID_KE) && (id_p == (ID **)&((Key *)self_id)->from)) {
-      /* We skip from here,
+    if (cb_flag & IDWALK_CB_LOOPBACK) {
+      /* We skip loopback pointers like Object.proxy_from or Key.from here,
        * since it's some internal pointer which is not relevant info for py/API level. */
       return IDWALK_RET_NOP;
     }