Fix T35176: Python fails with blend files from non-ASCII paths
authorCampbell Barton <ideasman42@gmail.com>
Wed, 30 Apr 2014 13:43:01 +0000 (23:43 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 30 Apr 2014 13:43:01 +0000 (23:43 +1000)
Thanks to Tamito for updating the patch to support Freestyle!

source/blender/python/generic/bpy_internal_import.c
source/blender/python/intern/bpy_interface.c

index a0e6204..2d19fdb 100644 (file)
@@ -47,6 +47,8 @@
 #include "BKE_text.h"  /* txt_to_buf */
 #include "BKE_main.h"
 
+#include "py_capi_utils.h"
+
 #include "bpy_internal_import.h"  /* own include */
 
 static Main *bpy_import_main = NULL;
@@ -133,6 +135,7 @@ void bpy_text_filename_get(char *fn, size_t fn_len, Text *text)
 bool bpy_text_compile(Text *text)
 {
        char fn_dummy[FILE_MAX];
+       PyObject *fn_dummy_py;
        char *buf;
 
        bpy_text_filename_get(fn_dummy, sizeof(fn_dummy), text);
@@ -140,10 +143,14 @@ bool bpy_text_compile(Text *text)
        /* if previously compiled, free the object */
        free_compiled_text(text);
 
+       fn_dummy_py = PyC_UnicodeFromByte(fn_dummy);
+
        buf = txt_to_buf(text);
-       text->compiled = Py_CompileString(buf, fn_dummy, Py_file_input);
+       text->compiled = Py_CompileStringObject(buf, fn_dummy_py, Py_file_input, NULL, -1);
        MEM_freeN(buf);
 
+       Py_DECREF(fn_dummy_py);
+
        if (PyErr_Occurred()) {
                PyErr_Print();
                PyErr_Clear();
index 93bced3..99e741c 100644 (file)
@@ -463,12 +463,17 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text,
                bpy_text_filename_get(fn_dummy, sizeof(fn_dummy), text);
 
                if (text->compiled == NULL) {   /* if it wasn't already compiled, do it now */
-                       char *buf = txt_to_buf(text);
+                       char *buf;
+                       PyObject *fn_dummy_py;
 
-                       text->compiled = Py_CompileString(buf, fn_dummy, Py_file_input);
+                       fn_dummy_py = PyC_UnicodeFromByte(fn_dummy);
 
+                       buf = txt_to_buf(text);
+                       text->compiled = Py_CompileStringObject(buf, fn_dummy_py, Py_file_input, NULL, -1);
                        MEM_freeN(buf);
 
+                       Py_DECREF(fn_dummy_py);
+
                        if (PyErr_Occurred()) {
                                if (do_jump) {
                                        python_script_error_jump_text(text);