diff options
author | Mark Spruiell <mes@zeroc.com> | 2009-10-27 13:20:39 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2009-10-27 13:20:39 -0700 |
commit | 370cfa6a7f7a3bb188dfb66bad09f3283a07aab8 (patch) | |
tree | 61b68c219c6c637f8621673d3b96bc8ad624c261 /py/modules/IcePy/Proxy.cpp | |
parent | bug 4333 - fixing TestUtil issue (diff) | |
download | ice-370cfa6a7f7a3bb188dfb66bad09f3283a07aab8.tar.bz2 ice-370cfa6a7f7a3bb188dfb66bad09f3283a07aab8.tar.xz ice-370cfa6a7f7a3bb188dfb66bad09f3283a07aab8.zip |
bug 4335 - Python segfault
Diffstat (limited to 'py/modules/IcePy/Proxy.cpp')
-rw-r--r-- | py/modules/IcePy/Proxy.cpp | 74 |
1 files changed, 54 insertions, 20 deletions
diff --git a/py/modules/IcePy/Proxy.cpp b/py/modules/IcePy/Proxy.cpp index da6e94d0b8b..36aea04dece 100644 --- a/py/modules/IcePy/Proxy.cpp +++ b/py/modules/IcePy/Proxy.cpp @@ -907,25 +907,20 @@ proxyIceRouter(ProxyObject* self, PyObject* args) return 0; } - PyObject* routerProxyType = lookupType("Ice.RouterPrx"); - assert(routerProxyType); - Ice::RouterPrx routerProxy; - if(PyObject_IsInstance(p, routerProxyType)) - { - routerProxy = Ice::RouterPrx::uncheckedCast(getProxy(p)); - } - else if(p != Py_None) + Ice::ObjectPrx proxy; + if(!getProxyArg(p, "ice_router", "rtr", proxy, "Ice.RouterPrx")) { - PyErr_Format(PyExc_ValueError, STRCAST("ice_router requires None or Ice.RouterPrx")); return 0; } + Ice::RouterPrx router = Ice::RouterPrx::uncheckedCast(proxy); + assert(self->proxy); Ice::ObjectPrx newProxy; try { - newProxy = (*self->proxy)->ice_router(routerProxy); + newProxy = (*self->proxy)->ice_router(router); } catch(const Ice::Exception& ex) { @@ -978,25 +973,20 @@ proxyIceLocator(ProxyObject* self, PyObject* args) return 0; } - PyObject* locatorProxyType = lookupType("Ice.LocatorPrx"); - assert(locatorProxyType); - Ice::LocatorPrx locatorProxy; - if(PyObject_IsInstance(p, locatorProxyType)) + Ice::ObjectPrx proxy; + if(!getProxyArg(p, "ice_locator", "loc", proxy, "Ice.LocatorPrx")) { - locatorProxy = Ice::LocatorPrx::uncheckedCast(getProxy(p)); - } - else if(p != Py_None) - { - PyErr_Format(PyExc_ValueError, STRCAST("ice_locator requires None or Ice.LocatorPrx")); return 0; } + Ice::LocatorPrx locator = Ice::LocatorPrx::uncheckedCast(proxy); + assert(self->proxy); Ice::ObjectPrx newProxy; try { - newProxy = (*self->proxy)->ice_locator(locatorProxy); + newProxy = (*self->proxy)->ice_locator(locator); } catch(const Ice::Exception& ex) { @@ -2044,6 +2034,50 @@ IcePy::getProxy(PyObject* p) return *obj->proxy; } +bool +IcePy::getProxyArg(PyObject* p, const string& func, const string& arg, Ice::ObjectPrx& proxy, const string& type) +{ + bool result = true; + + if(checkProxy(p)) + { + if(!type.empty()) + { + PyObject* proxyType = lookupType(type); + assert(proxyType); + if(!PyObject_IsInstance(p, proxyType)) + { + result = false; + } + } + } + else if(p != Py_None) + { + result = false; + } + + if(result) + { + if(p != Py_None) + { + ProxyObject* obj = reinterpret_cast<ProxyObject*>(p); + proxy = *obj->proxy; + } + else + { + proxy = 0; + } + } + else + { + string typeName = type.empty() ? "Ice.ObjectPrx" : type; + PyErr_Format(PyExc_ValueError, STRCAST("%s expects a proxy of type %s or None for argument '%s'"), + func.c_str(), typeName.c_str(), arg.c_str()); + } + + return result; +} + Ice::CommunicatorPtr IcePy::getProxyCommunicator(PyObject* p) { |