diff options
author | Mark Spruiell <mes@zeroc.com> | 2008-04-24 01:49:49 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2008-04-24 01:49:49 -0700 |
commit | e5457947f7b9a0498ffe94ca976614fb87544787 (patch) | |
tree | 9a29d7eec9e8a8a8edfcb1fa64dba217b3719ce9 /py/modules/IcePy/Util.cpp | |
parent | Fixed bug 3039 (diff) | |
download | ice-e5457947f7b9a0498ffe94ca976614fb87544787.tar.bz2 ice-e5457947f7b9a0498ffe94ca976614fb87544787.tar.xz ice-e5457947f7b9a0498ffe94ca976614fb87544787.zip |
bug 711 - accept Unicode objects in Python
Diffstat (limited to 'py/modules/IcePy/Util.cpp')
-rw-r--r-- | py/modules/IcePy/Util.cpp | 85 |
1 files changed, 72 insertions, 13 deletions
diff --git a/py/modules/IcePy/Util.cpp b/py/modules/IcePy/Util.cpp index 5c9cf1f17d9..08287f835c7 100644 --- a/py/modules/IcePy/Util.cpp +++ b/py/modules/IcePy/Util.cpp @@ -15,10 +15,48 @@ #include <Ice/LocalException.h> #include <IceUtil/UUID.h> #include <Slice/PythonUtil.h> +#include <frameobject.h> using namespace std; using namespace Slice::Python; +string +IcePy::getString(PyObject* p) +{ + assert(p == Py_None || PyString_Check(p)); + + string str; + if(p != Py_None) + { + str.assign(PyString_AS_STRING(p), PyString_GET_SIZE(p)); + } + return str; +} + +bool +IcePy::getStringArg(PyObject* p, const string& arg, string& val) +{ + if(PyString_Check(p)) + { + val = getString(p); + } + else if(p != Py_None) + { + // + // Get name of current function. + // + PyFrameObject *f = PyThreadState_GET()->frame; + PyObjectHandle code = PyObject_GetAttrString(reinterpret_cast<PyObject*>(f), STRCAST("f_code")); + assert(code.get()); + PyObjectHandle func = PyObject_GetAttrString(code.get(), STRCAST("co_name")); + assert(func.get()); + string funcName = getString(func.get()); + PyErr_Format(PyExc_ValueError, STRCAST("%s expects a string for argument '%s'"), funcName.c_str(), arg.c_str()); + return false; + } + return true; +} + IcePy::PyObjectHandle::PyObjectHandle(PyObject* p) : _p(p) { @@ -116,7 +154,7 @@ IcePy::PyException::raise() } else { - e.unknown = PyString_AS_STRING(name.get()); + e.unknown = getString(name.get()); } } throw e; @@ -195,12 +233,13 @@ IcePy::PyException::raiseLocalException() member = PyObject_GetAttrString(ex.get(), STRCAST("facet")); if(member.get() && PyString_Check(member.get())) { - e.facet = PyString_AS_STRING(member.get()); + // TODO: Support unicode for the facet name. + e.facet = getString(member.get()); } member = PyObject_GetAttrString(ex.get(), STRCAST("operation")); if(member.get() && PyString_Check(member.get())) { - e.operation = PyString_AS_STRING(member.get()); + e.operation = getString(member.get()); } throw; } @@ -224,9 +263,9 @@ IcePy::PyException::raiseLocalException() { IcePy::PyObjectHandle member; member = PyObject_GetAttrString(ex.get(), STRCAST("unknown")); - if(member.get() && PyString_Check(member.get()) && strlen(PyString_AS_STRING(member.get())) > 0) + if(member.get() && PyString_Check(member.get())) { - e.unknown = PyString_AS_STRING(member.get()); + e.unknown = getString(member.get()); } throw; } @@ -327,12 +366,17 @@ IcePy::listToStringSeq(PyObject* l, Ice::StringSeq& seq) { return false; } - if(!PyString_Check(item)) + string str; + if(PyString_Check(item)) + { + str = getString(item); + } + else if(item != Py_None) { PyErr_Format(PyExc_ValueError, STRCAST("list element must be a string")); return false; } - seq.push_back(string(PyString_AS_STRING(item), PyString_GET_SIZE(item))); + seq.push_back(str); } return true; @@ -376,12 +420,17 @@ IcePy::tupleToStringSeq(PyObject* t, Ice::StringSeq& seq) { return false; } - if(!PyString_Check(item)) + string str; + if(PyString_Check(item)) + { + str = getString(item); + } + else if(item != Py_None) { PyErr_Format(PyExc_ValueError, STRCAST("tuple element must be a string")); return false; } - seq.push_back(string(PyString_AS_STRING(item), PyString_GET_SIZE(item))); + seq.push_back(str); } return true; @@ -397,18 +446,28 @@ IcePy::dictionaryToContext(PyObject* dict, Ice::Context& context) PyObject* value; while(PyDict_Next(dict, &pos, &key, &value)) { - char* keystr = PyString_AsString(key); - if(!keystr) + string keystr; + if(PyString_Check(key)) + { + keystr = getString(key); + } + else if(key != Py_None) { PyErr_Format(PyExc_ValueError, STRCAST("context key must be a string")); return false; } - char* valuestr = PyString_AsString(value); - if(!valuestr) + + string valuestr; + if(PyString_Check(value)) + { + valuestr = getString(value); + } + else if(value != Py_None) { PyErr_Format(PyExc_ValueError, STRCAST("context value must be a string")); return false; } + context.insert(Ice::Context::value_type(keystr, valuestr)); } |