You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "James E. King, III (JIRA)" <ji...@apache.org> on 2017/02/08 22:18:41 UTC

[jira] [Commented] (THRIFT-4079) [Regression] Generated perl code that returns structures from included thrift files is missing a necessary use clause

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

James E. King, III commented on THRIFT-4079:
--------------------------------------------

I have confirmed this is a regression from the thrift 0.8.0 compiler.  The thrift 0.9.0 compiler shows this issue.
I'm really surprised this hasn't been reported until now... it makes me wonder how many folks are using thrift with perl. :(

> [Regression] Generated perl code that returns structures from included thrift files is missing a necessary use clause
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-4079
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4079
>             Project: Thrift
>          Issue Type: Bug
>          Components: Perl - Compiler
>    Affects Versions: 0.10.0
>         Environment: Ubuntu 14.04 LTS (perl 5.18.2) with thrift 0.10.0
>            Reporter: James E. King, III
>            Assignee: James E. King, III
>            Priority: Critical
>              Labels: regression
>
> I made a very simple example which I will attach, however in a nutshell if I define a structure in one thrift file like this:
> {{ForeignInfo.thrift:}}
> {noformat}
> namespace perl org.fiction.rpc
> struct ForeignInfo
> {
>     1: string someData
> }
> {noformat}
> Then I define a service in another namespace like this:
> {{SomeService.thrift:}}
> {noformat}
> namespace perl org.real
> include "ForeignInfo.thrift"
> service Company
> {
>     ForeignInfo.ForeignInfo getForeignInfoList();
> }
> {noformat}
> Then I compile both of them, the resulting generated perl code in {{gen-perl/org/real/Company.pm}} has the following use clauses in it:
> {noformat}
> require 5.6.0;
> use strict;
> use warnings;
> use Thrift;
> use org::real::Types;
> {noformat}
> Later on in the file we have:
> {noformat}
>     SWITCH: for($fid)
>     {
>       /^0$/ && do{      if ($ftype == TType::STRUCT) {
>         $self->{success} = new org::fiction::rpc::ForeignInfo();
>         $xfer += $self->{success}->read($input);
>       } else {
>         $xfer += $input->skip($ftype);
>       }
>       last; };
>         $xfer += $input->skip($ftype);
>     }
> {noformat}
> If you put a simple wrapper around this call, the client gets an exception:
> {noformat}
> Undefined subroutine &org::fiction::rpc::ForeignInfo called at gen-perl/org/real/Company.pm line 98
> {noformat}
> Line 98 is where {{org::fiction::rpc::ForeignInfo}} is mentioned.  Without a use clause for the Types defined by the include it cannot be used.
> If I add this line to the generated code in Company.pm:
> {noformat}
> use org::fiction::rpc::Types;
> {noformat}
> Then everything works.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)