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)