Commit 7a4b3601 authored by Robert McGibbon's avatar Robert McGibbon
Browse files

Fix typemap for str/bytes -> std::string

parent 7cdeded0
...@@ -169,11 +169,10 @@ ...@@ -169,11 +169,10 @@
$result = PyBytes_FromStringAndSize($1.c_str(), $1.length()); $result = PyBytes_FromStringAndSize($1.c_str(), $1.length());
} }
%typemap(in) const std::string & {
%typemap(in) std::string { // if we have a C++ method that takes in a std::string, we're most happy to
// if we have a C++ method that takes in a std::string, we're most happy to accept // accept a python bytes object. But if the user passes in a unicode object
// a python bytes object. But if the user passes in a unicode object we'll try // we'll try to recover by encoding it to UTF-8 bytes
// to recover by encoding it to UTF-8 bytes
PyObject* temp = NULL; PyObject* temp = NULL;
char* c_str = NULL; char* c_str = NULL;
Py_ssize_t len = 0; Py_ssize_t len = 0;
...@@ -181,19 +180,24 @@ ...@@ -181,19 +180,24 @@
if (PyUnicode_Check($input)) { if (PyUnicode_Check($input)) {
temp = PyUnicode_AsUTF8String($input); temp = PyUnicode_AsUTF8String($input);
if (temp == NULL) { if (temp == NULL) {
SWIG_exception_fail(SWIG_TypeError, "'utf-8' codec can't decode byte"); SWIG_exception_fail(SWIG_TypeError, "$symname: 'utf-8' codec can't decode byte");
} }
PyBytes_AsStringAndSize(temp, &c_str, &len); PyBytes_AsStringAndSize(temp, &c_str, &len);
Py_XDECREF(temp); Py_XDECREF(temp);
} else if (PyBytes_Check($input)) { } else if (PyBytes_Check($input)) {
PyBytes_AsStringAndSize($input, &c_str, &len); PyBytes_AsStringAndSize($input, &c_str, &len);
} else { } else {
SWIG_exception_fail(SWIG_TypeError, "argument must be str or bytes"); SWIG_exception_fail(SWIG_TypeError, "$symname: argument must be str or bytes");
} }
if (c_str == NULL) { if (c_str == NULL) {
SWIG_exception_fail(SWIG_TypeError, "argument must be str or bytes"); SWIG_exception_fail(SWIG_TypeError, "$symname: argument must be str or bytes");
} }
$1 = std::string(c_str, len); std::string temp2(c_str, len);
$1 = &temp2;
}
%typemap(freearg) const std::string & {
// Don't delete me
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment