Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-4079

Generated perl code that returns structures from included thrift files is missing a necessary use clause

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 0.8, 0.10.0
    • Fix Version/s: 0.11.0
    • Component/s: Perl - Compiler
    • Labels:
      None
    • Environment:

      Ubuntu 14.04 LTS (perl 5.18.2) with thrift 0.10.0

      Description

      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:

      namespace perl org.fiction.rpc
      
      struct ForeignInfo
      {
          1: string someData
      }
      

      Then I define a service in another namespace like this:

      SomeService.thrift:

      namespace perl org.real
      
      include "ForeignInfo.thrift"
      
      service Company
      {
          ForeignInfo.ForeignInfo getForeignInfoList();
      }
      

      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:

      require 5.6.0;
      use strict;
      use warnings;
      use Thrift;
      
      use org::real::Types;
      

      Later on in the file we have:

          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);
          }
      

      If you put a simple wrapper around this call, the client gets an exception:

      Undefined subroutine &org::fiction::rpc::ForeignInfo called at gen-perl/org/real/Company.pm line 98
      

      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:

      use org::fiction::rpc::Types;
      

      Then everything works.

        Attachments

        1. THRIFT-4079-reopened.tgz
          1 kB
          James E. King III
        2. THRIFT-4079-example.tgz
          0.9 kB
          James E. King III

          Activity

            People

            • Assignee:
              jking3 James E. King III
              Reporter:
              jking3 James E. King III
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: