You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Martin Vogt (JIRA)" <ji...@apache.org> on 2013/10/06 21:21:45 UTC

[jira] [Created] (THRIFT-2220) Add a new struct structv?

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)