diff --git a/common/swig/wx_python_helpers.cpp b/common/swig/wx_python_helpers.cpp index 587fe2a2d1..e8922076ed 100644 --- a/common/swig/wx_python_helpers.cpp +++ b/common/swig/wx_python_helpers.cpp @@ -74,7 +74,11 @@ wxString* newWxStringFromPy( PyObject* src ) PyObject* uni_str = src; // if not an str or unicode, try to str(src) +#if PY_MAJOR_VERSION >= 3 + if( !PyBytes_Check( src ) && !PyUnicode_Check( src ) ) +#else if( !PyString_Check( src ) && !PyUnicode_Check( src ) ) +#endif { obj = PyObject_Str( src ); must_unref_obj = true; @@ -83,7 +87,11 @@ wxString* newWxStringFromPy( PyObject* src ) return NULL; } +#if PY_MAJOR_VERSION >= 3 + if( PyBytes_Check( obj ) ) +#else if( PyString_Check( obj ) ) +#endif { uni_str = PyUnicode_FromEncodedObject( obj, wxPythonEncoding, "strict" ); must_unref_str = true; @@ -97,8 +105,13 @@ wxString* newWxStringFromPy( PyObject* src ) if( len ) { +#if PY_MAJOR_VERSION >= 3 + PyUnicode_AsWideChar( uni_str, + wxStringBuffer( *result, len ), len ); +#else PyUnicode_AsWideChar( (PyUnicodeObject*) uni_str, wxStringBuffer( *result, len ), len ); +#endif } if( must_unref_str ) @@ -122,7 +135,11 @@ wxString* newWxStringFromPy( PyObject* src ) if( PyErr_Occurred() ) return NULL; } +#if PY_MAJOR_VERSION >= 3 + else if( !PyBytes_Check( src ) ) +#else else if( !PyString_Check( src ) ) // if it's not a string, str(obj) +#endif { str = PyObject_Str( src ); must_unref_str = true; diff --git a/pcbnew/swig/pcbnew_action_plugins.cpp b/pcbnew/swig/pcbnew_action_plugins.cpp index 10efdf95f4..445c73e64e 100644 --- a/pcbnew/swig/pcbnew_action_plugins.cpp +++ b/pcbnew/swig/pcbnew_action_plugins.cpp @@ -107,7 +107,11 @@ wxString PYTHON_ACTION_PLUGIN::CallRetStrMethod( const char* aMethod, PyObject* if( result ) { +#if PY_MAJOR_VERSION >= 3 + const char* str_res = PyBytes_AS_STRING( result ); +#else const char* str_res = PyString_AsString( result ); +#endif ret = FROM_UTF8( str_res ); Py_DECREF( result ); } diff --git a/pcbnew/swig/pcbnew_footprint_wizards.cpp b/pcbnew/swig/pcbnew_footprint_wizards.cpp index ed7edc5e68..8b47636b4a 100644 --- a/pcbnew/swig/pcbnew_footprint_wizards.cpp +++ b/pcbnew/swig/pcbnew_footprint_wizards.cpp @@ -101,7 +101,11 @@ wxString PYTHON_FOOTPRINT_WIZARD::CallRetStrMethod( const char* aMethod, PyObjec if( result ) { +#if PY_MAJOR_VERSION >= 3 + const char* str_res = PyBytes_AS_STRING( result ); +#else const char* str_res = PyString_AsString( result ); +#endif ret = FROM_UTF8( str_res ); Py_DECREF( result ); } @@ -173,10 +177,17 @@ int PYTHON_FOOTPRINT_WIZARD::GetNumParameterPages() if( result ) { +#if PY_MAJOR_VERSION >= 3 + if( !PyLong_Check( result ) ) + return -1; + + ret = PyLong_AsLong( result ); +#else if( !PyInt_Check( result ) ) return -1; ret = PyInt_AsLong( result ); +#endif Py_DECREF( result ); } @@ -197,7 +208,11 @@ wxString PYTHON_FOOTPRINT_WIZARD::GetParameterPageName( int aPage ) if( result ) { +#if PY_MAJOR_VERSION >= 3 + const char* str_res = PyBytes_AS_STRING( result ); +#else const char* str_res = PyString_AsString( result ); +#endif ret = FROM_UTF8( str_res ); Py_DECREF( result ); } @@ -305,7 +320,11 @@ wxString PYTHON_FOOTPRINT_WIZARD::SetParameterValues( int aPage, wxArrayString& for( int i = 0; i < len; i++ ) { wxString& str = aValues[i]; +#if PY_MAJOR_VERSION >= 3 + PyObject* py_str = PyUnicode_FromString( (const char*) str.mb_str() ); +#else PyObject* py_str = PyString_FromString( (const char*) str.mb_str() ); +#endif PyList_SetItem( py_list, i, py_str ); } diff --git a/pcbnew/swig/python_scripting.cpp b/pcbnew/swig/python_scripting.cpp index 2f0b6a3f28..9bc46e17f4 100644 --- a/pcbnew/swig/python_scripting.cpp +++ b/pcbnew/swig/python_scripting.cpp @@ -41,9 +41,15 @@ /* init functions defined by swig */ +#if PY_MAJOR_VERSION >= 3 +extern "C" PyObject* init_kicad( void ); + +extern "C" PyObject* init_pcbnew( void ); +#else extern "C" void init_kicad( void ); extern "C" void init_pcbnew( void ); +#endif #define EXTRA_PYTHON_MODULES 10 // this is the number of python // modules that we want to add into the list @@ -67,7 +73,11 @@ bool IsWxPythonLoaded() /* Add a name + initfuction to our SwigImportInittab */ +#if PY_MAJOR_VERSION >= 3 +static void swigAddModule( const char* name, PyObject* (* initfunc)() ) +#else static void swigAddModule( const char* name, void (* initfunc)() ) +#endif { SwigImportInittab[SwigNumModules].name = (char*) name; SwigImportInittab[SwigNumModules].initfunc = initfunc; @@ -236,7 +246,11 @@ static void pcbnewRunPythonMethodWithReturnedString( const char* aMethodName, wx if( pobj ) { PyObject* str = PyDict_GetItemString(localDict, "result" ); +#if PY_MAJOR_VERSION >= 3 + const char* str_res = str ? PyBytes_AS_STRING( str ) : 0; +#else const char* str_res = str ? PyString_AsString( str ) : 0; +#endif aNames = FROM_UTF8( str_res ); Py_DECREF( pobj ); } @@ -386,7 +400,13 @@ wxArrayString PyArrayStringToWx( PyObject* aArrayString ) PyObject* element = PyList_GetItem( aArrayString, n ); if( element ) - ret.Add( FROM_UTF8( PyString_AsString( element ) ), 1 ); + { +#if PY_MAJOR_VERSION >= 3 + ret.Add( FROM_UTF8( PyBytes_AS_STRING( element ) ), 1 ); +#else + ret.Add( FROM_UTF8( PyString_AsString( element ) ), 1 ); +#endif + } } return ret; @@ -406,7 +426,11 @@ wxString PyErrStringWithTraceback() PyErr_Fetch( &type, &value, &traceback ); +#if PY_MAJOR_VERSION >= 3 + PyObject* tracebackModuleString = PyUnicode_FromString( "traceback" ); +#else PyObject* tracebackModuleString = PyString_FromString( "traceback" ); +#endif PyObject* tracebackModule = PyImport_Import( tracebackModuleString ); Py_DECREF( tracebackModuleString );