[ https://issues.apache.org/jira/browse/THRIFT-4365?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Finn Isaac Norris Colman updated THRIFT-4365: --------------------------------------------- Component/s: Perl - Compiler > Perl generated code uses indirect object syntax, which occasionally causes > compilation errors. > ---------------------------------------------------------------------------------------------- > > Key: THRIFT-4365 > URL: https://issues.apache.org/jira/browse/THRIFT-4365 > Project: Thrift > Issue Type: Bug > Components: Perl - Compiler > Affects Versions: 0.10.0 > Reporter: Finn Isaac Norris Colman > Labels: easyfix > > When running the Thrift compiler for Perl the automatically generated code > uses "Indirect Object Syntax". So the generated code looks like this: > {noformat} > $self->{success} = new contact_types::Response(); > {noformat} > It should look like this: > {noformat} > $self->{success} = contact_types::Response->new(); > {noformat} > I found in some cases the indirect object syntax can actually cause failures > because Perl gets confused and thinks Response is a subroutine, with an error > like this: > {noformat} > Undefined subroutine &user_types::Response called at gen-perl/user/Service.pm > line 131. > {noformat} > If you look in https://perldoc.perl.org/perlobj.html under the "Indirect > Object Syntax" heading, you see it says: > "Outside of the file handle case, use of this syntax is discouraged as it can > confuse the Perl interpreter. See below for more details.". > Fixing this problem should be straight forward. In the > https://github.com/apache/thrift/blob/master/compiler/cpp/src/thrift/generate/t_perl_generator.cc > it should instead of doing this: > {noformat} > out << indent() << "$" << prefix << " = new " << > perl_namespace(tstruct->get_program()) > << tstruct->get_name() << "();" << endl << indent() << "$xfer += $" << > prefix > << "->read($input);" << endl; > {noformat} > Do this: > {noformat} > out << indent() << "$" << prefix << " = " << > perl_namespace(tstruct->get_program()) > << tstruct->get_name() << "->new();" << endl << indent() << "$xfer += > $" << prefix > << "->read($input);" << endl; > {noformat} -- This message was sent by Atlassian JIRA (v6.4.14#64029)