Commit bfdae096 authored by peastman's avatar peastman
Browse files

Merge pull request #774 from rmcgibbo/bytes-4

Fix typemap for str/bytes -> std::string
parents a9c75e52 21bf9597
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
int i, n; int i, n;
PyObject *pyList; PyObject *pyList;
n=(*$1).size(); n=(*$1).size();
pyList=PyList_New(n); pyList=PyList_New(n);
PyObject* mm = PyImport_AddModule("simtk.openmm"); PyObject* mm = PyImport_AddModule("simtk.openmm");
PyObject* vec3 = PyObject_GetAttrString(mm, "Vec3"); PyObject* vec3 = PyObject_GetAttrString(mm, "Vec3");
...@@ -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 & (std::string temp2) {
%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); temp2 = std::string(c_str, len);
} $1 = &temp2;
\ No newline at end of file }
%typemap(freearg) const std::string & {
// pass
}
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