[
https://issues.apache.org/jira/browse/THRIFT-4079?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15936634#comment-15936634
]
ASF GitHub Bot commented on THRIFT-4079:
----------------------------------------
GitHub user jeking3 opened a pull request:
https://github.com/apache/thrift/pull/1219
THRIFT-4079: emit use clauses in Types.pm generated files as well (fix
reopened defect)
The original fix only took care of the generated file for the service, if
the service has a method that uses a structure from an included thrift file,
use clauses were emitted.
The issue was re-opened because if a structure in one thrift file contains
a field for a structure defined in another thrift file, the perl generated code
doesn't work properly as described in the defect since these live in Types.pm,
and it needs the same use clauses emitted.
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/jeking3/thrift THRIFT-4079
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/thrift/pull/1219.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #1219
----
commit bfefdc33a0510b436efc7687fd29bf054e7d1ba8
Author: James E. King, III <[email protected]>
Date: 2017-03-22T16:31:35Z
THRIFT-4079: emit use clauses in Types.pm generated files as well (fix
reopened defect)
----
> 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.8, 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
> Fix For: 0.11.0
>
> Attachments: THRIFT-4079-example.tgz, THRIFT-4079-reopened.tgz
>
>
> 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)