Revision: 102345 https://trac.macports.org/changeset/102345 Author: blair@macports.org Date: 2013-01-31 11:18:35 -0800 (Thu, 31 Jan 2013) Log Message: ----------- zeroc-ice34: add patches to use Thrift as a data interchange format for java and python. Patches by: J Robert Ray jrray{_at_}imageworks{_dot_}com Modified Paths: -------------- trunk/dports/devel/zeroc-ice34/Portfile Added Paths: ----------- trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-java.diff trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-python.diff Modified: trunk/dports/devel/zeroc-ice34/Portfile =================================================================== --- trunk/dports/devel/zeroc-ice34/Portfile 2013-01-31 18:04:27 UTC (rev 102344) +++ trunk/dports/devel/zeroc-ice34/Portfile 2013-01-31 19:18:35 UTC (rev 102345) @@ -5,6 +5,7 @@ name zeroc-ice34 version 3.4.2 +revision 1 set branch [join [lrange [split ${version} .] 0 1] .] categories devel maintainers blair @@ -117,7 +118,9 @@ patch-ice.cpp.test.IceUtil.unicode.Client.cpp.diff \ patch-ice.cpp.test.Slice.keyword.Client.cpp.diff \ patch-ice.cpp.test.include.TestCommon.h.diff \ - patch-ice.scripts.TestUtil.py.diff + patch-ice.scripts.TestUtil.py.diff \ + patch-add-thrift-support-for-java.diff \ + patch-add-thrift-support-for-python.diff patch.pre_args -p1 platforms darwin Added: trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-java.diff =================================================================== --- trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-java.diff (rev 0) +++ trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-java.diff 2013-01-31 19:18:35 UTC (rev 102345) @@ -0,0 +1,207 @@ +# 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/cpp/src/Slice/JavaUtil.cpp Ice-3.4.2/cpp/src/Slice/JavaUtil.cpp +--- Ice-3.4.2.orig/cpp/src/Slice/JavaUtil.cpp 2011-06-15 12:43:59.000000000 -0700 ++++ Ice-3.4.2/cpp/src/Slice/JavaUtil.cpp 2013-01-31 10:50:46.000000000 -0800 +@@ -553,6 +553,11 @@ + { + return string("Ice.Holder<") + meta.substr(prefix.size()) + " >"; + } ++ prefix = "java:thrift:"; ++ if(seq->findMetaData(prefix, meta)) ++ { ++ return string("Ice.Holder<") + meta.substr(prefix.size()) + " >"; ++ } + } + + // +@@ -591,6 +596,11 @@ + { + return meta.substr(prefix.size()); + } ++ prefix = "java:thrift:"; ++ if(seq->findMetaData(prefix, meta)) ++ { ++ return meta.substr(prefix.size()); ++ } + } + + string instanceType, formalType; +@@ -1088,6 +1098,7 @@ + { + string meta; + static const string protobuf = "java:protobuf:"; ++ static const string thrift = "java:thrift:"; + static const string serializable = "java:serializable:"; + if(seq->findMetaData(serializable, meta)) + { +@@ -1128,6 +1139,44 @@ + } + return; + } ++ else if(seq->findMetaData(thrift, meta)) ++ { ++ if(marshal) ++ { ++ out << nl << "try"; ++ out << sb; ++ out << nl << "org.apache.thrift.TSerializer serializer = " ++ << "new org.apache.thrift.TSerializer(" ++ << "new org.apache.thrift.protocol.TBinaryProtocol.Factory());"; ++ out << nl << stream << ".writeByteSeq(serializer.serialize(" << v << "));"; ++ out << eb; ++ out << nl << "catch(org.apache.thrift.TException __ex)"; ++ out << sb; ++ out << nl << "Ice.MarshalException __mex = new Ice.MarshalException();"; ++ out << nl << "__mex.initCause(__ex);"; ++ out << nl << "throw __mex;"; ++ out << eb; ++ } ++ else ++ { ++ string type = typeToString(seq, TypeModeIn, package); ++ out << nl << "try"; ++ out << sb; ++ out << nl << "org.apache.thrift.TDeserializer deserializer = " ++ << "new org.apache.thrift.TDeserializer(" ++ << "new org.apache.thrift.protocol.TBinaryProtocol.Factory());"; ++ out << nl << v << " = new " << type << "();"; ++ out << nl << "deserializer.deserialize(" << v << ", " << stream << ".readByteSeq());"; ++ out << eb; ++ out << nl << "catch(org.apache.thrift.TException __ex)"; ++ out << sb; ++ out << nl << "Ice.MarshalException __mex = new Ice.MarshalException();"; ++ out << nl << "__mex.initCause(__ex);"; ++ out << nl << "throw __mex;"; ++ out << eb; ++ } ++ return; ++ } + } + + bool customType = false; +@@ -1956,6 +2005,7 @@ + { + string meta; + static const string protobuf = "java:protobuf:"; ++ static const string thrift = "java:thrift:"; + static const string serializable = "java:serializable:"; + if(seq->findMetaData(serializable, meta)) + { +@@ -1996,6 +2046,44 @@ + } + return; + } ++ else if(seq->findMetaData(thrift, meta)) ++ { ++ if(marshal) ++ { ++ out << nl << "try"; ++ out << sb; ++ out << nl << "org.apache.thrift.TSerializer serializer = " ++ << "new org.apache.thrift.TSerializer(" ++ << "new org.apache.thrift.protocol.TBinaryProtocol.Factory());"; ++ out << nl << stream << ".writeByteSeq(serializer.serialize(" << v << "));"; ++ out << eb; ++ out << nl << "catch(org.apache.thrift.TException __ex)"; ++ out << sb; ++ out << nl << "Ice.MarshalException __mex = new Ice.MarshalException();"; ++ out << nl << "__mex.initCause(__ex);"; ++ out << nl << "throw __mex;"; ++ out << eb; ++ } ++ else ++ { ++ string type = meta.substr(thrift.size()); ++ out << nl << "try"; ++ out << sb; ++ out << nl << "org.apache.thrift.TDeserializer deserializer = " ++ << "new org.apache.thrift.TDeserializer(" ++ << "new org.apache.thrift.protocol.TBinaryProtocol.Factory());"; ++ out << nl << v << " = new " << type << "();"; ++ out << nl << "deserializer.deserialize(" << v << ", " << stream << ".readByteSeq());"; ++ out << eb; ++ out << nl << "catch(org.apache.thrift.TException __ex)"; ++ out << sb; ++ out << nl << "Ice.MarshalException __mex = new Ice.MarshalException();"; ++ out << nl << "__mex.initCause(__ex);"; ++ out << nl << "throw __mex;"; ++ out << eb; ++ } ++ return; ++ } + } + + // +@@ -2436,7 +2524,9 @@ + { + return true; + } +- else if(str.find("java:protobuf:") == 0 || str.find("java:serializable:") == 0) ++ else if(str.find("java:protobuf:") == 0 || ++ str.find("java:thrift:") == 0 || ++ str.find("java:serializable:") == 0) + { + SequencePtr seq = SequencePtr::dynamicCast(cont); + if(seq) +@@ -2731,6 +2821,7 @@ + Slice::JavaGenerator::MetaDataVisitor::visitSequence(const SequencePtr& p) + { + static const string protobuf = "java:protobuf:"; ++ static const string thrift = "java:thrift:"; + static const string serializable = "java:serializable:"; + StringList metaData = getMetaData(p); + const string file = p->file(); +@@ -2740,7 +2831,9 @@ + string s = *q++; + if(_history.count(s) == 0) // Don't complain about the same metadata more than once. + { +- if(s.find(protobuf) == 0 || s.find(serializable) == 0) ++ if(s.find(protobuf) == 0 || ++ s.find(thrift) == 0 || ++ s.find(serializable) == 0) + { + // + // Remove from list so validateType does not try to handle as well. +@@ -2829,6 +2922,11 @@ + result.push_back(s); + continue; + } ++ else if(s.substr(prefix.size(), pos - prefix.size()) == "thrift") ++ { ++ result.push_back(s); ++ continue; ++ } + + emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'"); + } +@@ -2865,7 +2963,9 @@ + } + emitWarning(file, line, "invalid metadata for " + str); + } +- else if(i->find("java:protobuf:") == 0 || i->find("java:serializable:") == 0) ++ else if(i->find("java:protobuf:") == 0 || ++ i->find("java:thrift:") == 0 || ++ i->find("java:serializable:") == 0) + { + // + // Only valid in sequence defintion which is checked in visitSequence +diff -ru Ice-3.4.2.orig/cpp/src/slice2java/Gen.cpp Ice-3.4.2/cpp/src/slice2java/Gen.cpp +--- Ice-3.4.2.orig/cpp/src/slice2java/Gen.cpp 2011-06-15 12:43:59.000000000 -0700 ++++ Ice-3.4.2/cpp/src/slice2java/Gen.cpp 2013-01-31 10:50:46.000000000 -0800 +@@ -3692,6 +3692,12 @@ + return; // No holders for protobuf types. + + } ++ prefix = "java:thrift:"; ++ if(p->findMetaData(prefix, meta)) ++ { ++ return; // No holders for thrift types. ++ ++ } + } + + writeHolder(p); Added: trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-python.diff =================================================================== --- trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-python.diff (rev 0) +++ trunk/dports/devel/zeroc-ice34/files/patch-add-thrift-support-for-python.diff 2013-01-31 19:18:35 UTC (rev 102345) @@ -0,0 +1,318 @@ +# 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/cpp/src/Slice/PythonUtil.cpp Ice-3.4.2/cpp/src/Slice/PythonUtil.cpp +--- Ice-3.4.2.orig/cpp/src/Slice/PythonUtil.cpp 2011-06-15 12:43:59.000000000 -0700 ++++ Ice-3.4.2/cpp/src/Slice/PythonUtil.cpp 2013-01-31 10:50:29.000000000 -0800 +@@ -1320,9 +1320,11 @@ + Slice::Python::CodeVisitor::visitSequence(const SequencePtr& p) + { + static const string protobuf = "python:protobuf:"; ++ static const string thrift = "python:thrift:"; + StringList metaData = p->getMetaData(); + bool isCustom = false; + string customType; ++ string encoder; + for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q) + { + if(q->find(protobuf) == 0) +@@ -1334,6 +1336,19 @@ + } + isCustom = true; + customType = q->substr(protobuf.size()); ++ encoder = "protobuf"; ++ break; ++ } ++ else if(q->find(thrift) == 0) ++ { ++ BuiltinPtr builtin = BuiltinPtr::dynamicCast(p->type()); ++ if(!builtin || builtin->kind() != Builtin::KindByte) ++ { ++ continue; ++ } ++ isCustom = true; ++ customType = q->substr(thrift.size()); ++ encoder = "thrift"; + break; + } + } +@@ -1346,10 +1361,10 @@ + _out.inc(); + if(isCustom) + { +- string package = customType.substr(0, customType.find('.')); ++ string package = customType.substr(0, customType.rfind('.')); + _out << nl << "import " << package; + _out << nl << "_M_" << getAbsolute(p, "_t_") +- << " = IcePy.defineCustom('" << scoped << "', " << customType << ")"; ++ << " = IcePy.defineCustom('" << scoped << "', " << customType << ", '" << encoder << "')"; + } + else + { +@@ -2456,6 +2471,7 @@ + Slice::Python::MetaDataVisitor::visitSequence(const SequencePtr& p) + { + static const string protobuf = "python:protobuf:"; ++ static const string thrift = "python:thrift:"; + StringList metaData = p->getMetaData(); + const string file = p->file(); + const string line = p->line(); +@@ -2476,6 +2492,20 @@ + "`protobuf' encoding must be a byte sequence"); + } + } ++ else if(s.find(thrift) == 0) ++ { ++ // ++ // Remove from list so validateSequence does not try to handle as well. ++ // ++ metaData.remove(s); ++ ++ BuiltinPtr builtin = BuiltinPtr::dynamicCast(p->type()); ++ if(!builtin || builtin->kind() != Builtin::KindByte) ++ { ++ emitWarning(file, line, "ignoring invalid metadata `" + s + ": " + ++ "`thrift' encoding must be a byte sequence"); ++ } ++ } + } + + validateSequence(file, line, p, metaData); +diff -ru Ice-3.4.2.orig/py/modules/IcePy/Types.cpp Ice-3.4.2/py/modules/IcePy/Types.cpp +--- Ice-3.4.2.orig/py/modules/IcePy/Types.cpp 2011-06-15 12:44:00.000000000 -0700 ++++ Ice-3.4.2/py/modules/IcePy/Types.cpp 2013-01-31 10:50:29.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 Ice-3.4.2/py/modules/IcePy/Types.h +--- Ice-3.4.2.orig/py/modules/IcePy/Types.h 2011-06-15 12:44:00.000000000 -0700 ++++ Ice-3.4.2/py/modules/IcePy/Types.h 2013-01-31 10:50:29.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; +