Rewrite C extensions to also support Python 3

This commit is contained in:
Thomas Pointhuber 2018-08-03 15:23:32 +02:00 committed by Maciej Suminski
parent de7b362695
commit 284904b72c
4 changed files with 65 additions and 1 deletions

View File

@ -74,7 +74,11 @@ wxString* newWxStringFromPy( PyObject* src )
PyObject* uni_str = src; PyObject* uni_str = src;
// if not an str or unicode, try to 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 ) ) if( !PyString_Check( src ) && !PyUnicode_Check( src ) )
#endif
{ {
obj = PyObject_Str( src ); obj = PyObject_Str( src );
must_unref_obj = true; must_unref_obj = true;
@ -83,7 +87,11 @@ wxString* newWxStringFromPy( PyObject* src )
return NULL; return NULL;
} }
#if PY_MAJOR_VERSION >= 3
if( PyBytes_Check( obj ) )
#else
if( PyString_Check( obj ) ) if( PyString_Check( obj ) )
#endif
{ {
uni_str = PyUnicode_FromEncodedObject( obj, wxPythonEncoding, "strict" ); uni_str = PyUnicode_FromEncodedObject( obj, wxPythonEncoding, "strict" );
must_unref_str = true; must_unref_str = true;
@ -97,8 +105,13 @@ wxString* newWxStringFromPy( PyObject* src )
if( len ) if( len )
{ {
#if PY_MAJOR_VERSION >= 3
PyUnicode_AsWideChar( uni_str,
wxStringBuffer( *result, len ), len );
#else
PyUnicode_AsWideChar( (PyUnicodeObject*) uni_str, PyUnicode_AsWideChar( (PyUnicodeObject*) uni_str,
wxStringBuffer( *result, len ), len ); wxStringBuffer( *result, len ), len );
#endif
} }
if( must_unref_str ) if( must_unref_str )
@ -122,7 +135,11 @@ wxString* newWxStringFromPy( PyObject* src )
if( PyErr_Occurred() ) if( PyErr_Occurred() )
return NULL; 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) else if( !PyString_Check( src ) ) // if it's not a string, str(obj)
#endif
{ {
str = PyObject_Str( src ); str = PyObject_Str( src );
must_unref_str = true; must_unref_str = true;

View File

@ -107,7 +107,11 @@ wxString PYTHON_ACTION_PLUGIN::CallRetStrMethod( const char* aMethod, PyObject*
if( result ) if( result )
{ {
#if PY_MAJOR_VERSION >= 3
const char* str_res = PyBytes_AS_STRING( result );
#else
const char* str_res = PyString_AsString( result ); const char* str_res = PyString_AsString( result );
#endif
ret = FROM_UTF8( str_res ); ret = FROM_UTF8( str_res );
Py_DECREF( result ); Py_DECREF( result );
} }

View File

@ -101,7 +101,11 @@ wxString PYTHON_FOOTPRINT_WIZARD::CallRetStrMethod( const char* aMethod, PyObjec
if( result ) if( result )
{ {
#if PY_MAJOR_VERSION >= 3
const char* str_res = PyBytes_AS_STRING( result );
#else
const char* str_res = PyString_AsString( result ); const char* str_res = PyString_AsString( result );
#endif
ret = FROM_UTF8( str_res ); ret = FROM_UTF8( str_res );
Py_DECREF( result ); Py_DECREF( result );
} }
@ -173,10 +177,17 @@ int PYTHON_FOOTPRINT_WIZARD::GetNumParameterPages()
if( result ) if( result )
{ {
#if PY_MAJOR_VERSION >= 3
if( !PyLong_Check( result ) )
return -1;
ret = PyLong_AsLong( result );
#else
if( !PyInt_Check( result ) ) if( !PyInt_Check( result ) )
return -1; return -1;
ret = PyInt_AsLong( result ); ret = PyInt_AsLong( result );
#endif
Py_DECREF( result ); Py_DECREF( result );
} }
@ -197,7 +208,11 @@ wxString PYTHON_FOOTPRINT_WIZARD::GetParameterPageName( int aPage )
if( result ) if( result )
{ {
#if PY_MAJOR_VERSION >= 3
const char* str_res = PyBytes_AS_STRING( result );
#else
const char* str_res = PyString_AsString( result ); const char* str_res = PyString_AsString( result );
#endif
ret = FROM_UTF8( str_res ); ret = FROM_UTF8( str_res );
Py_DECREF( result ); Py_DECREF( result );
} }
@ -305,7 +320,11 @@ wxString PYTHON_FOOTPRINT_WIZARD::SetParameterValues( int aPage, wxArrayString&
for( int i = 0; i < len; i++ ) for( int i = 0; i < len; i++ )
{ {
wxString& str = aValues[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() ); PyObject* py_str = PyString_FromString( (const char*) str.mb_str() );
#endif
PyList_SetItem( py_list, i, py_str ); PyList_SetItem( py_list, i, py_str );
} }

View File

@ -41,9 +41,15 @@
/* init functions defined by swig */ /* 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_kicad( void );
extern "C" void init_pcbnew( void ); extern "C" void init_pcbnew( void );
#endif
#define EXTRA_PYTHON_MODULES 10 // this is the number of python #define EXTRA_PYTHON_MODULES 10 // this is the number of python
// modules that we want to add into the list // modules that we want to add into the list
@ -67,7 +73,11 @@ bool IsWxPythonLoaded()
/* Add a name + initfuction to our SwigImportInittab */ /* 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)() ) static void swigAddModule( const char* name, void (* initfunc)() )
#endif
{ {
SwigImportInittab[SwigNumModules].name = (char*) name; SwigImportInittab[SwigNumModules].name = (char*) name;
SwigImportInittab[SwigNumModules].initfunc = initfunc; SwigImportInittab[SwigNumModules].initfunc = initfunc;
@ -236,7 +246,11 @@ static void pcbnewRunPythonMethodWithReturnedString( const char* aMethodName, wx
if( pobj ) if( pobj )
{ {
PyObject* str = PyDict_GetItemString(localDict, "result" ); 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; const char* str_res = str ? PyString_AsString( str ) : 0;
#endif
aNames = FROM_UTF8( str_res ); aNames = FROM_UTF8( str_res );
Py_DECREF( pobj ); Py_DECREF( pobj );
} }
@ -386,7 +400,13 @@ wxArrayString PyArrayStringToWx( PyObject* aArrayString )
PyObject* element = PyList_GetItem( aArrayString, n ); PyObject* element = PyList_GetItem( aArrayString, n );
if( element ) 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; return ret;
@ -406,7 +426,11 @@ wxString PyErrStringWithTraceback()
PyErr_Fetch( &type, &value, &traceback ); PyErr_Fetch( &type, &value, &traceback );
#if PY_MAJOR_VERSION >= 3
PyObject* tracebackModuleString = PyUnicode_FromString( "traceback" );
#else
PyObject* tracebackModuleString = PyString_FromString( "traceback" ); PyObject* tracebackModuleString = PyString_FromString( "traceback" );
#endif
PyObject* tracebackModule = PyImport_Import( tracebackModuleString ); PyObject* tracebackModule = PyImport_Import( tracebackModuleString );
Py_DECREF( tracebackModuleString ); Py_DECREF( tracebackModuleString );