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
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-07-11 17:57:56 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-07-11 17:57:56 +0400
commitb1d01dae36ffa735090e8daec9b8ed953fef0aa4 (patch)
treeb211179d2791afe411959577e2eb8f77d227fffc /source/blender/python/intern
parentb775f1bb322a6277916c24ca282b899532a52e96 (diff)
PyApi
* refcount error if StringIO or io modules could not be imported * importing python modules like math didnt work because the script registration overwrote the script path. now just prepend the path.
Diffstat (limited to 'source/blender/python/intern')
-rw-r--r--source/blender/python/intern/bpy_interface.c22
-rw-r--r--source/blender/python/intern/bpy_util.c25
2 files changed, 26 insertions, 21 deletions
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 42eb9c4c57a..a07c447c718 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -457,8 +457,7 @@ void BPY_run_ui_scripts(bContext *C, int reload)
PyGILState_STATE gilstate;
PyObject *mod;
- PyObject *sys_path_orig;
- PyObject *sys_path_new;
+ PyObject *sys_path;
gilstate = PyGILState_Ensure();
@@ -466,6 +465,10 @@ void BPY_run_ui_scripts(bContext *C, int reload)
BPy_SetContext(C);
bpy_import_main_set(CTX_data_main(C));
+
+ sys_path= PySys_GetObject("path"); /* borrow */
+ PyList_Insert(sys_path, 0, Py_None); /* place holder, resizes the list */
+
for(a=0; dirs[a]; a++) {
dirname= BLI_gethome_folder(dirs[a]);
@@ -476,15 +479,9 @@ void BPY_run_ui_scripts(bContext *C, int reload)
if(!dir)
continue;
-
- /* backup sys.path */
- sys_path_orig= PySys_GetObject("path");
- Py_INCREF(sys_path_orig); /* dont free it */
- sys_path_new= PyList_New(1);
- PyList_SET_ITEM(sys_path_new, 0, PyUnicode_FromString(dirname));
- PySys_SetObject("path", sys_path_new);
- Py_DECREF(sys_path_new);
+ /* set the first dir in the sys.path for fast importing of modules */
+ PyList_SetItem(sys_path, 0, PyUnicode_FromString(dirname)); /* steals the ref */
while((de = readdir(dir)) != NULL) {
/* We could stat the file but easier just to let python
@@ -514,11 +511,10 @@ void BPY_run_ui_scripts(bContext *C, int reload)
}
closedir(dir);
-
- PySys_SetObject("path", sys_path_orig);
- Py_DECREF(sys_path_orig);
}
+ PyList_SetSlice(sys_path, 0, 1, NULL); /* remove the first item */
+
bpy_import_main_set(NULL);
PyGILState_Release(gilstate);
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c
index 9f1ef0c6251..b451923e780 100644
--- a/source/blender/python/intern/bpy_util.c
+++ b/source/blender/python/intern/bpy_util.c
@@ -348,8 +348,8 @@ PyObject *BPY_exception_buffer(void)
PyObject *stderr_backup = PySys_GetObject("stderr"); /* borrowed */
PyObject *string_io = NULL;
PyObject *string_io_buf = NULL;
- PyObject *string_io_mod;
- PyObject *string_io_getvalue;
+ PyObject *string_io_mod= NULL;
+ PyObject *string_io_getvalue= NULL;
PyObject *error_type, *error_value, *error_traceback;
@@ -369,14 +369,11 @@ PyObject *BPY_exception_buffer(void)
#else
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
#endif
- return NULL;
+ goto error_cleanup;
} else if (! (string_io = PyObject_CallMethod(string_io_mod, "StringIO", NULL))) {
- Py_DECREF(string_io_mod);
- return NULL;
+ goto error_cleanup;
} else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
- Py_DECREF(string_io_mod);
- Py_DECREF(string_io);
- return NULL;
+ goto error_cleanup;
}
Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced.
@@ -403,6 +400,18 @@ PyObject *BPY_exception_buffer(void)
PyErr_Clear();
return string_io_buf;
+
+
+error_cleanup:
+ /* could not import the module so print the error and close */
+ Py_XDECREF(string_io_mod);
+ Py_XDECREF(string_io);
+
+ PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_Print(); /* print the error */
+ PyErr_Clear();
+
+ return NULL;
}
char *BPy_enum_as_string(EnumPropertyItem *item)