[Bf-blender-cvs] [7aeaf5da0ea] master: Fix crash when accessing `view_layer.depsgraph` through BPY

Julian Eisel noreply at git.blender.org
Fri Aug 21 11:31:41 CEST 2020


Commit: 7aeaf5da0eaf2310f9b984f953f9a3a2ea02883c
Author: Julian Eisel
Date:   Fri Aug 21 11:19:07 2020 +0200
Branches: master
https://developer.blender.org/rB7aeaf5da0eaf2310f9b984f953f9a3a2ea02883c

Fix crash when accessing `view_layer.depsgraph` through BPY

For the sanity checks to work we don't actually need to check other
scenes. So this function can be simplified so that it does not require
a `Main *`.

Mistake in 5cc08510e0a6.

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

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 3ab923f05f6..2a5e4527676 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -110,8 +110,7 @@ void BKE_toolsettings_free(struct ToolSettings *toolsettings);
 struct Scene *BKE_scene_duplicate(struct Main *bmain, struct Scene *sce, eSceneCopyMethod type);
 void BKE_scene_groups_relink(struct Scene *sce);
 
-struct Scene *BKE_scene_find_from_view_layer(const struct Main *bmain,
-                                             const struct ViewLayer *layer);
+bool BKE_scene_has_view_layer(const struct Scene *scene, const struct ViewLayer *layer);
 struct Scene *BKE_scene_find_from_collection(const struct Main *bmain,
                                              const struct Collection *collection);
 
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 1dc51c9ddae..9edd56c984f 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -1129,15 +1129,9 @@ int BKE_scene_base_iter_next(
   return iter->phase;
 }
 
-Scene *BKE_scene_find_from_view_layer(const Main *bmain, const ViewLayer *layer)
+bool BKE_scene_has_view_layer(const Scene *scene, const ViewLayer *layer)
 {
-  for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
-    if (BLI_findindex(&scene->view_layers, layer) != -1) {
-      return scene;
-    }
-  }
-
-  return NULL;
+  return BLI_findindex(&scene->view_layers, layer) != -1;
 }
 
 Scene *BKE_scene_find_from_collection(const Main *bmain, const Collection *collection)
@@ -2255,9 +2249,11 @@ static Depsgraph **scene_get_depsgraph_p(Main *bmain,
                                          const bool allocate_ghash_entry,
                                          const bool allocate_depsgraph)
 {
+  /* bmain may be NULL here! */
   BLI_assert(scene != NULL);
   BLI_assert(view_layer != NULL);
-  BLI_assert(BKE_scene_find_from_view_layer(bmain, view_layer) == scene);
+  BLI_assert(BKE_scene_has_view_layer(scene, view_layer));
+
   /* Make sure hash itself exists. */
   if (allocate_ghash_entry) {
     BKE_scene_ensure_depsgraph_hash(scene);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index ec1a77c9520..54d349a7950 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -929,7 +929,7 @@ static const char *rna_Scene_statistics_string_get(Scene *scene,
                                                    ReportList *reports,
                                                    ViewLayer *view_layer)
 {
-  if (BKE_scene_find_from_view_layer(bmain, view_layer) != scene) {
+  if (!BKE_scene_has_view_layer(scene, view_layer)) {
     BKE_reportf(reports,
                 RPT_ERROR,
                 "View Layer '%s' not found in scene '%s'",



More information about the Bf-blender-cvs mailing list