diff options
author | Mark Spruiell <mes@zeroc.com> | 2016-12-09 15:18:08 -0800 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2016-12-09 15:18:08 -0800 |
commit | 3b7e9f99b61538e0bbd6f07deeb7f7cb12013ed5 (patch) | |
tree | a8edbf5d1043527cc50880b34ee83458ed7e4855 /python/modules/IcePy/Util.cpp | |
parent | Merge remote-tracking branch 'origin/3.6' (diff) | |
download | ice-3b7e9f99b61538e0bbd6f07deeb7f7cb12013ed5.tar.bz2 ice-3b7e9f99b61538e0bbd6f07deeb7f7cb12013ed5.tar.xz ice-3b7e9f99b61538e0bbd6f07deeb7f7cb12013ed5.zip |
ICE-7138 - new Python AMI mapping based on futures and modified AMD mapping
Diffstat (limited to 'python/modules/IcePy/Util.cpp')
-rw-r--r-- | python/modules/IcePy/Util.cpp | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/python/modules/IcePy/Util.cpp b/python/modules/IcePy/Util.cpp index b40d9f3dcfb..8d0cd602aae 100644 --- a/python/modules/IcePy/Util.cpp +++ b/python/modules/IcePy/Util.cpp @@ -468,11 +468,12 @@ IcePy::PyException::getTraceback() PyObjectHandle str = createString("traceback"); PyObjectHandle mod = PyImport_Import(str.get()); assert(mod.get()); // Unable to import traceback module - Python installation error? - PyObject* d = PyModule_GetDict(mod.get()); - PyObject* func = PyDict_GetItemString(d, "format_exception"); + PyObject* func = PyDict_GetItemString(PyModule_GetDict(mod.get()), "format_exception"); assert(func); // traceback.format_exception must be present. PyObjectHandle args = Py_BuildValue("(OOO)", _type.get(), ex.get(), _tb.get()); + assert(args.get()); PyObjectHandle list = PyObject_CallObject(func, args.get()); + assert(list.get()); string result; for(Py_ssize_t i = 0; i < PyList_GET_SIZE(list.get()); ++i) @@ -1090,6 +1091,60 @@ IcePy::getEncodingVersion(PyObject* args, Ice::EncodingVersion& v) return true; } +PyObject* +IcePy::callMethod(PyObject* obj, const string& name, PyObject* arg1, PyObject* arg2) +{ + PyObjectHandle method = PyObject_GetAttrString(obj, const_cast<char*>(name.c_str())); + if(!method.get()) + { + return 0; + } + return callMethod(method.get(), arg1, arg2); +} + +PyObject* +IcePy::callMethod(PyObject* method, PyObject* arg1, PyObject* arg2) +{ + PyObjectHandle args; + if(arg1 && arg2) + { + args = PyTuple_New(2); + if(!args.get()) + { + return 0; + } + PyTuple_SET_ITEM(args.get(), 0, incRef(arg1)); + PyTuple_SET_ITEM(args.get(), 1, incRef(arg2)); + } + else if(arg1) + { + args = PyTuple_New(1); + if(!args.get()) + { + return 0; + } + PyTuple_SET_ITEM(args.get(), 0, incRef(arg1)); + } + else if(arg2) + { + args = PyTuple_New(1); + if(!args.get()) + { + return 0; + } + PyTuple_SET_ITEM(args.get(), 0, incRef(arg2)); + } + else + { + args = PyTuple_New(0); + if(!args.get()) + { + return 0; + } + } + return PyObject_Call(method, args.get(), 0); +} + extern "C" PyObject* IcePy_stringVersion(PyObject* /*self*/) |