You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Jens Geyer (JIRA)" <ji...@apache.org> on 2013/10/07 20:57:42 UTC

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

    [ https://issues.apache.org/jira/browse/THRIFT-2220?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13788435#comment-13788435 ] 

Jens Geyer edited comment on THRIFT-2220 at 10/7/13 6:56 PM:
-------------------------------------------------------------

I probably just don't see it, but why do we need a new struct type? 


was (Author: jensg):
I probabbly just don't see it, but why do we need a new struct type? 

> Add a new struct structv?
> -------------------------
>
>                 Key: THRIFT-2220
>                 URL: https://issues.apache.org/jira/browse/THRIFT-2220
>             Project: Thrift
>          Issue Type: Improvement
>          Components: C++ - Compiler
>    Affects Versions: 0.9.1
>            Reporter: Martin Vogt
>            Priority: Minor
>
> 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:
> {code}
> 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);
> }
> {code}
> This is then generated into someting like this:
> {code}
> 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
> [..]
> {code}
> 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)