Revision: 102346 https://trac.macports.org/changeset/102346 Author: blair@macports.org Date: 2013-01-31 11:31:26 -0800 (Thu, 31 Jan 2013) Log Message: ----------- py-zeroc-ice34: add patch to use Thrift as a data interchange format. Patch by: J Robert Ray jrray{_at_}imageworks{_dot_}com Modified Paths: -------------- trunk/dports/python/py-zeroc-ice34/Portfile Added Paths: ----------- trunk/dports/python/py-zeroc-ice34/files/patch-add-thrift-support.diff Modified: trunk/dports/python/py-zeroc-ice34/Portfile =================================================================== --- trunk/dports/python/py-zeroc-ice34/Portfile 2013-01-31 19:18:35 UTC (rev 102345) +++ trunk/dports/python/py-zeroc-ice34/Portfile 2013-01-31 19:31:26 UTC (rev 102346) @@ -5,7 +5,7 @@ name py-zeroc-ice34 version 3.4.2 -revision 1 +revision 2 set branch [join [lrange [split ${version} .] 0 1] .] categories-append devel maintainers blair @@ -38,7 +38,8 @@ checksums md5 e97672eb4a63c6b8dd202d0773e19dc7 \ sha1 8c84d6e3b227f583d05e08251e07047e6c3a6b42 \ rmd160 7ce680a4eb5fa9d0bb6f8b8910e267dfc2373d75 -patchfiles patch-py.config.Make.rules.Darwin.diff +patchfiles patch-py.config.Make.rules.Darwin.diff \ + patch-add-thrift-support.diff platforms darwin python.versions 25 26 27 Added: trunk/dports/python/py-zeroc-ice34/files/patch-add-thrift-support.diff =================================================================== --- trunk/dports/python/py-zeroc-ice34/files/patch-add-thrift-support.diff (rev 0) +++ trunk/dports/python/py-zeroc-ice34/files/patch-add-thrift-support.diff 2013-01-31 19:31:26 UTC (rev 102346) @@ -0,0 +1,241 @@ +# Patch to support Thrift as a data interchange format in the same +# manner as Ice supports Google Protocol Buffers. +# +# Patch by: J Robert Ray jrray{_at_}imageworks{_dot_}com + +diff -ru ../Ice-3.4.2.orig/py/modules/IcePy/Types.cpp ./py/modules/IcePy/Types.cpp +--- ../Ice-3.4.2.orig/py/modules/IcePy/Types.cpp 2011-06-15 12:44:00.000000000 -0700 ++++ ./py/modules/IcePy/Types.cpp 2013-01-31 11:20:55.000000000 -0800 +@@ -1877,22 +1877,55 @@ + { + assert(PyObject_IsInstance(p, pythonType.get()) == 1); // validate() should have caught this. + +- PyObjectHandle obj = PyObject_CallMethod(p, STRCAST("IsInitialized"), 0); +- if(!obj.get()) +- { +- throwPythonException(); +- } +- if(!PyObject_IsTrue(obj.get())) +- { +- setPythonException(Ice::MarshalException(__FILE__, __LINE__, "type not fully initialized")); +- throw AbortMarshaling(); ++ PyObjectHandle obj; ++ ++ if (thrift) { ++ PyObjectHandle transportOut = PyObject_Call(TMemoryBuffer.get(), emptyTuple.get(), NULL); ++ if (!transportOut.get()) { ++ throwPythonException(); ++ } ++ ++ PyObjectHandle tup = PyTuple_New(1); ++ if (!tup.get()) { ++ throwPythonException(); ++ } ++ Py_INCREF(transportOut.get()); ++ PyTuple_SET_ITEM(tup.get(), 0, transportOut.get()); ++ ++ PyObjectHandle protocolOut = PyObject_Call(TBinaryProtocol.get(), tup.get(), NULL); ++ if (!protocolOut.get()) { ++ throwPythonException(); ++ } ++ ++ obj = PyObject_CallMethodObjArgs(p, writeStr.get(), protocolOut.get(), NULL); ++ if (!obj.get()) { ++ throwPythonException(); ++ } ++ ++ obj = PyObject_CallMethodObjArgs(transportOut.get(), getvalueStr.get(), NULL); ++ if (!obj.get()) { ++ assert(PyErr_Occurred()); ++ throw AbortMarshaling(); ++ } + } ++ else { ++ PyObjectHandle obj = PyObject_CallMethod(p, STRCAST("IsInitialized"), 0); ++ if(!obj.get()) ++ { ++ throwPythonException(); ++ } ++ if(!PyObject_IsTrue(obj.get())) ++ { ++ setPythonException(Ice::MarshalException(__FILE__, __LINE__, "type not fully initialized")); ++ throw AbortMarshaling(); ++ } + +- obj = PyObject_CallMethod(p, STRCAST("SerializeToString"), 0); +- if(!obj.get()) +- { +- assert(PyErr_Occurred()); +- throw AbortMarshaling(); ++ obj = PyObject_CallMethod(p, STRCAST("SerializeToString"), 0); ++ if(!obj.get()) ++ { ++ assert(PyErr_Occurred()); ++ throw AbortMarshaling(); ++ } + } + + assert(PyString_Check(obj.get())); +@@ -1913,16 +1946,10 @@ + int sz = static_cast<int>(seq.second - seq.first); + + // +- // Create a new instance of the protobuf type. ++ // Create a new instance of the protobuf/thrift type. + // +- PyObjectHandle args = PyTuple_New(0); +- if(!args.get()) +- { +- assert(PyErr_Occurred()); +- throw AbortMarshaling(); +- } + PyTypeObject* type = reinterpret_cast<PyTypeObject*>(pythonType.get()); +- PyObjectHandle p = type->tp_new(type, args.get(), 0); ++ PyObjectHandle p = type->tp_new(type, emptyTuple.get(), 0); + if(!p.get()) + { + assert(PyErr_Occurred()); +@@ -1932,7 +1959,7 @@ + // + // Initialize the object. + // +- PyObjectHandle obj = PyObject_CallMethod(p.get(), STRCAST("__init__"), 0, 0); ++ PyObjectHandle obj = PyObject_CallMethodObjArgs(p.get(), initStr.get(), NULL); + if(!obj.get()) + { + assert(PyErr_Occurred()); +@@ -1949,14 +1976,45 @@ + throw AbortMarshaling(); + } + +- // +- // Parse the string. +- // +- obj = PyObject_CallMethod(p.get(), STRCAST("ParseFromString"), STRCAST("O"), obj.get(), 0); +- if(!obj.get()) +- { +- assert(PyErr_Occurred()); +- throw AbortMarshaling(); ++ if (thrift) { ++ PyObjectHandle tup = PyTuple_New(1); ++ if (!tup.get()) { ++ throwPythonException(); ++ } ++ PyTuple_SET_ITEM(tup.get(), 0, obj.release()); ++ ++ PyObjectHandle transportIn = PyObject_Call(TMemoryBuffer.get(), tup.get(), NULL); ++ if (!transportIn.get()) { ++ throwPythonException(); ++ } ++ ++ tup = PyTuple_New(1); ++ if (!tup.get()) { ++ throwPythonException(); ++ } ++ PyTuple_SET_ITEM(tup.get(), 0, transportIn.release()); ++ ++ PyObjectHandle protocolIn = PyObject_Call(TBinaryProtocol.get(), tup.get(), NULL); ++ if (!protocolIn.get()) { ++ throwPythonException(); ++ } ++ ++ obj = PyObject_CallMethodObjArgs(p.get(), readStr.get(), protocolIn.get(), NULL); ++ if (!obj.get()) { ++ assert(PyErr_Occurred()); ++ throw AbortMarshaling(); ++ } ++ } ++ else { ++ // ++ // Parse the string. ++ // ++ obj = PyObject_CallMethod(p.get(), STRCAST("ParseFromString"), STRCAST("O"), obj.get(), 0); ++ if(!obj.get()) ++ { ++ assert(PyErr_Occurred()); ++ throw AbortMarshaling(); ++ } + } + + cb->unmarshaled(p.get(), target, closure); +@@ -3213,7 +3271,8 @@ + { + char* id; + PyObject* type; +- if(!PyArg_ParseTuple(args, STRCAST("sO"), &id, &type)) ++ char* encoder; ++ if(!PyArg_ParseTuple(args, STRCAST("sOs"), &id, &type, &encoder)) + { + return 0; + } +@@ -3223,6 +3282,52 @@ + CustomInfoPtr info = new CustomInfo; + info->id = id; + info->pythonType = type; ++ if (!strncmp(encoder, "thrift", 6)) { ++ info->thrift = true; ++ ++ PyObjectHandle TTransport = PyImport_ImportModule(STRCAST("thrift.transport.TTransport")); ++ if (!TTransport.get()) { ++ throwPythonException(); ++ } ++ info->TMemoryBuffer = PyObject_GetAttrString(TTransport.get(), STRCAST("TMemoryBuffer")); ++ if (!info->TMemoryBuffer.get()) { ++ throwPythonException(); ++ } ++ ++ PyObjectHandle TBinaryProtocol = PyImport_ImportModule(STRCAST("thrift.protocol.TBinaryProtocol")); ++ if (!TBinaryProtocol.get()) { ++ throwPythonException(); ++ } ++ info->TBinaryProtocol = PyObject_GetAttrString(TBinaryProtocol.get(), STRCAST("TBinaryProtocol")); ++ if (!info->TBinaryProtocol.get()) { ++ throwPythonException(); ++ } ++ ++ info->readStr = PyString_FromStringAndSize(STRCAST("read"), 4); ++ if (!info->readStr.get()) { ++ throwPythonException(); ++ } ++ ++ info->writeStr = PyString_FromStringAndSize(STRCAST("write"), 5); ++ if (!info->writeStr.get()) { ++ throwPythonException(); ++ } ++ ++ info->getvalueStr = PyString_FromStringAndSize(STRCAST("getvalue"), 8); ++ if (!info->getvalueStr.get()) { ++ throwPythonException(); ++ } ++ } ++ ++ info->emptyTuple = PyTuple_New(0); ++ if (!info->emptyTuple.get()) { ++ throwPythonException(); ++ } ++ ++ info->initStr = PyString_FromStringAndSize(STRCAST("__init__"), 8); ++ if (!info->initStr.get()) { ++ throwPythonException(); ++ } + + return createType(info); + } +diff -ru ../Ice-3.4.2.orig/py/modules/IcePy/Types.h ./py/modules/IcePy/Types.h +--- ../Ice-3.4.2.orig/py/modules/IcePy/Types.h 2011-06-15 12:44:00.000000000 -0700 ++++ ./py/modules/IcePy/Types.h 2013-01-31 11:20:55.000000000 -0800 +@@ -271,6 +271,14 @@ + + std::string id; + PyObjectHandle pythonType; ++ bool thrift; ++ PyObjectHandle TMemoryBuffer; ++ PyObjectHandle TBinaryProtocol; ++ PyObjectHandle emptyTuple; ++ PyObjectHandle readStr; ++ PyObjectHandle writeStr; ++ PyObjectHandle getvalueStr; ++ PyObjectHandle initStr; + }; + typedef IceUtil::Handle<CustomInfo> CustomInfoPtr; +
participants (1)
-
blair@macports.org