diff options
author | Mark Spruiell <mes@zeroc.com> | 2018-02-12 16:06:06 -0800 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2018-02-12 16:06:06 -0800 |
commit | 4d08ac5ea3a35eed33d8e537f9c4813690eae2ed (patch) | |
tree | 487bc621ce0a31c6b6e97e3ba9ca5a80085430b8 /python/modules/IcePy/Connection.cpp | |
parent | Update MSBuild project to use 5.0.3 zeroc.icebuilder.msbuild package (diff) | |
download | ice-4d08ac5ea3a35eed33d8e537f9c4813690eae2ed.tar.bz2 ice-4d08ac5ea3a35eed33d8e537f9c4813690eae2ed.tar.xz ice-4d08ac5ea3a35eed33d8e537f9c4813690eae2ed.zip |
ICE-8293 - Reduce casting in Python extension
ICE-8661 - Connection.getAdapter returns bogus value in Python
ICE-8662 - Review Python type checking
ICE-8663 - Accept None for callbacks
Diffstat (limited to 'python/modules/IcePy/Connection.cpp')
-rw-r--r-- | python/modules/IcePy/Connection.cpp | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/python/modules/IcePy/Connection.cpp b/python/modules/IcePy/Connection.cpp index 0e92b423fb6..ef8c47ce5ba 100644 --- a/python/modules/IcePy/Connection.cpp +++ b/python/modules/IcePy/Connection.cpp @@ -476,7 +476,15 @@ connectionGetAdapter(ConnectionObject* self) return 0; } - return wrapObjectAdapter(adapter); + if(adapter) + { + return wrapObjectAdapter(adapter); + } + else + { + Py_INCREF(Py_None); + return Py_None; + } } #ifdef WIN32 @@ -591,6 +599,7 @@ connectionBeginFlushBatchRequests(ConnectionObject* self, PyObject* args, PyObje PyObject* compressBatchType = lookupType("Ice.CompressBatch"); if(!PyObject_IsInstance(compressBatch, reinterpret_cast<PyObject*>(compressBatchType))) { + PyErr_Format(PyExc_ValueError, STRCAST("expected an Ice.CompressBatch enumerator")); return 0; } @@ -681,14 +690,25 @@ connectionSetCloseCallback(ConnectionObject* self, PyObject* args) { assert(self->connection); - PyObject* callbackType = lookupType("types.FunctionType"); PyObject* cb; - if(!PyArg_ParseTuple(args, STRCAST("O!"), callbackType, &cb)) + if(!PyArg_ParseTuple(args, STRCAST("O"), &cb)) { return 0; } - Ice::CloseCallbackPtr wrapper = new CloseCallbackWrapper(cb, reinterpret_cast<PyObject*>(self)); + PyObject* callbackType = lookupType("types.FunctionType"); + if(cb != Py_None && !PyObject_IsInstance(cb, callbackType)) + { + PyErr_Format(PyExc_ValueError, STRCAST("callback must be None or a function")); + return 0; + } + + Ice::CloseCallbackPtr wrapper; + if(cb != Py_None) + { + wrapper = new CloseCallbackWrapper(cb, reinterpret_cast<PyObject*>(self)); + } + try { AllowThreads allowThreads; // Release Python's global interpreter lock during blocking invocations. @@ -712,14 +732,25 @@ connectionSetHeartbeatCallback(ConnectionObject* self, PyObject* args) { assert(self->connection); - PyObject* callbackType = lookupType("types.FunctionType"); PyObject* cb; - if(!PyArg_ParseTuple(args, STRCAST("O!"), callbackType, &cb)) + if(!PyArg_ParseTuple(args, STRCAST("O"), &cb)) { return 0; } - Ice::HeartbeatCallbackPtr wrapper = new HeartbeatCallbackWrapper(cb, reinterpret_cast<PyObject*>(self)); + PyObject* callbackType = lookupType("types.FunctionType"); + if(cb != Py_None && !PyObject_IsInstance(cb, callbackType)) + { + PyErr_Format(PyExc_ValueError, STRCAST("callback must be None or a function")); + return 0; + } + + Ice::HeartbeatCallbackPtr wrapper; + if(cb != Py_None) + { + wrapper = new HeartbeatCallbackWrapper(cb, reinterpret_cast<PyObject*>(self)); + } + try { AllowThreads allowThreads; // Release Python's global interpreter lock during blocking invocations. |