From d9ce1cda94c256326d09efa69b55682bde98ea8b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 8 May 2012 22:07:06 +0000 Subject: [PATCH] Python/context: python could get invalid bpy.data in scene update handler after undo. The way this got updated from the context is a bit unreliable, and for handlers the update couldn't happen because there is no context passed in. Now it's updated from setup_app_data, which is where the change actually happens. I left in the other updates to be sure but they should not be needed anymore. --- source/blender/blenkernel/intern/blender.c | 9 +++++++++ source/blender/python/BPY_extern.h | 1 + source/blender/python/intern/bpy_interface.c | 9 +++++---- source/blender/python/intern/bpy_rna.c | 6 ++++-- source/blender/python/intern/bpy_util.h | 1 - 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index d8ae95e08e2..b2cbf0a1ce1 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -91,6 +91,10 @@ #include "WM_api.h" // XXXXX BAD, very BAD dependency (bad level call) - remove asap, elubie +#ifdef WITH_PYTHON +#include "BPY_extern.h" +#endif + Global G; UserDef U; /* ListBase = {NULL, NULL}; */ @@ -288,6 +292,11 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath G.f = bfd->globalf; +#ifdef WITH_PYTHON + /* let python know about new main */ + BPY_context_update(C); +#endif + if (!G.background) { //setscreen(G.curscreen); } diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index 33ea139b474..83a40ecc068 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -82,6 +82,7 @@ int BPY_string_exec(struct bContext *C, const char *expr); void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */ int BPY_context_member_get(struct bContext *C, const char *member, struct bContextDataResult *result); void BPY_context_set(struct bContext *C); +void BPY_context_update(struct bContext *C); void BPY_id_release(struct ID *id); diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index d638a3edf30..f3f05e93930 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -96,7 +96,7 @@ static double bpy_timer_run_tot; /* accumulate python runs */ #endif /* use for updating while a python script runs - in case of file load */ -void bpy_context_update(bContext *C) +void BPY_context_update(bContext *C) { /* don't do this from a non-main (e.g. render) thread, it can cause a race * condition on C->data.recursion. ideal solution would be to disable @@ -117,7 +117,7 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate) *gilstate = PyGILState_Ensure(); if (py_call_level == 1) { - bpy_context_update(C); + BPY_context_update(C); #ifdef TIME_PY_RUN if (bpy_timer_count == 0) { @@ -178,7 +178,8 @@ void BPY_modules_update(bContext *C) /* refreshes the main struct */ BPY_update_rna_module(); - bpy_context_module->ptr.data = (void *)C; + if(bpy_context_module) + bpy_context_module->ptr.data = (void *)C; } void BPY_context_set(bContext *C) @@ -623,7 +624,7 @@ void BPY_modules_load_user(bContext *C) /* update pointers since this can run from a nested script * on file load */ if (py_call_level) { - bpy_context_update(C); + BPY_context_update(C); } bpy_context_set(C, &gilstate); diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 2174241eeda..13c34465560 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -6339,11 +6339,13 @@ PyObject *BPY_rna_module(void) void BPY_update_rna_module(void) { + if(rna_module_ptr) { #if 0 - RNA_main_pointer_create(G.main, rna_module_ptr); + RNA_main_pointer_create(G.main, rna_module_ptr); #else - rna_module_ptr->data = G.main; /* just set data is enough */ + rna_module_ptr->data = G.main; /* just set data is enough */ #endif + } } #if 0 diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h index 4bebcb2ed85..63660b06813 100644 --- a/source/blender/python/intern/bpy_util.h +++ b/source/blender/python/intern/bpy_util.h @@ -49,7 +49,6 @@ short BPy_errors_to_report(struct ReportList *reports); struct bContext *BPy_GetContext(void); void BPy_SetContext(struct bContext *C); -extern void bpy_context_update(struct bContext *C); extern void bpy_context_set(struct bContext *C, PyGILState_STATE *gilstate); extern void bpy_context_clear(struct bContext *C, PyGILState_STATE *gilstate); #endif