diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-07-11 17:57:56 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-07-11 17:57:56 +0400 |
commit | b1d01dae36ffa735090e8daec9b8ed953fef0aa4 (patch) | |
tree | b211179d2791afe411959577e2eb8f77d227fffc /source/blender/python | |
parent | b775f1bb322a6277916c24ca282b899532a52e96 (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')
-rw-r--r-- | source/blender/python/intern/bpy_interface.c | 22 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_util.c | 25 |
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) |