Martin Vogt created THRIFT-2220: ----------------------------------- Summary: Add a new struct structv? Key: THRIFT-2220 URL: https://issues.apache.org/jira/browse/THRIFT-2220 Project: Thrift Issue Type: Bug Components: C++ - Compiler Affects Versions: 0.9.1 Reporter: Martin Vogt
Thrift cannot extend structs, but maybe its possible to add a virtual base struct? Today I updated the "TBase" patch for gen cpp. https://issues.apache.org/jira/browse/THRIFT-1712 After that, I modified the compiler to accept a new struct type, which describes that the marshalled struct needs to be created before the read(iproto) starts. (write already is fine, because on writing the specialized class is already created, only the "read" needs some factory, for the real implementation) For example: struct_v TMVBase <<-- struct_v tell the generator to created the TBase class with a factory ("v" for virtual) service USB { void martin(1:TMVBase base); } This is then generated into someting like this: uint32_t USB_martin_args::read(::apache::thrift::protocol::TProtocol* iprot) { [...] switch (fid) { case 1: if (ftype == ::apache::thrift::protocol::T_STRUCT) { // TBase struct create:this->base this->base=TMVBase::create(iprot); xfer += this->base->read(iprot); this->__isset.base = true; } else { xfer += iprot->skip(ftype); } break [..] This would allow to create the derived classed (from TBase) during marshall, without the need to define every method with any possible struct. Curently I have modified thrifty.yy and some other things, so that yacc actually parse this new "struct_v" type. But the generated source for it needs to be changed some more. The Protocolhandlers need to write the struct name on the wire, of course (which they currenty don' do). I think I can make a working prototype and post the patch. -- This message was sent by Atlassian JIRA (v6.1#6144)