summaryrefslogtreecommitdiff
path: root/python/modules/IcePy/Connection.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2018-02-12 16:06:06 -0800
committerMark Spruiell <mes@zeroc.com>2018-02-12 16:06:06 -0800
commit4d08ac5ea3a35eed33d8e537f9c4813690eae2ed (patch)
tree487bc621ce0a31c6b6e97e3ba9ca5a80085430b8 /python/modules/IcePy/Connection.cpp
parentUpdate MSBuild project to use 5.0.3 zeroc.icebuilder.msbuild package (diff)
downloadice-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.cpp45
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.