Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-09 02:07:06 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-09 02:07:06 +0400
commitd9ce1cda94c256326d09efa69b55682bde98ea8b (patch)
treeceb0555b93092d0a48fa82025553ae12fcc31ae3 /source
parentf6abd6ee401fb19a3005c0f0b604674b026eb270 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/blender.c9
-rw-r--r--source/blender/python/BPY_extern.h1
-rw-r--r--source/blender/python/intern/bpy_interface.c9
-rw-r--r--source/blender/python/intern/bpy_rna.c6
-rw-r--r--source/blender/python/intern/bpy_util.h1
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