Finn Isaac Norris Colman created THRIFT-4365:
------------------------------------------------

             Summary: 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
            Reporter: Finn Isaac Norris Colman


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)

Reply via email to