[ 
https://issues.apache.org/jira/browse/THRIFT-3783?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15230882#comment-15230882
 ] 

ASF GitHub Bot commented on THRIFT-3783:
----------------------------------------

Github user Jens-G commented on a diff in the pull request:

    https://github.com/apache/thrift/pull/982#discussion_r58929379
  
    --- Diff: compiler/cpp/src/generate/t_py_generator.cc ---
    @@ -384,6 +406,55 @@ void t_py_generator::init_generator() {
         py_autogen_comment() << endl <<
         py_imports() << endl <<
         "from .ttypes import *" << endl;
    +
    +  construct_object_dependent_graph();
    +}
    +
    +/**
    + * Construct object dependent graph to determine object generate order
    + * if cycle dependent is detected, generate process will be aborted
    + * object dependent example
    + * struct A {
    + * 1: B b;
    + * }
    + * struct B {
    + * }
    + *
    + * then B should be generated before A in ttypes.py, otherwise runtime 
error exception will be thrown
    + * in generated python code
    + */
    +void t_py_generator::construct_object_dependent_graph() {
    +  const std::vector<t_struct*>& objects = program_->get_objects();
    +  for (size_t i = 0; i < objects.size(); ++i) {
    +    object_ids_[objects[i]] = i;
    +  }
    +
    +  std::vector<DependentGraphEdge> edges;
    +  for (size_t i = 0; i < objects.size(); i++) {
    +    const vector<t_field*>& members = objects[i]->get_members();
    +    for(vector<t_field*>::const_iterator m_iter = members.begin(); m_iter 
!= members.end(); ++m_iter) {
    +      t_type* type = get_true_type((*m_iter)->get_type());
    +      if (!type->is_struct() && !type->is_xception()) {
    +        continue;
    +      }
    +      map<t_struct*, int>::const_iterator it = 
object_ids_.find((t_struct*)type);
    +      if (it != object_ids_.end()) {
    +        edges.push_back(DependentGraphEdge(it->second, i));
    +      }
    +    }
    +  }
    +
    +  DependentGraph dependent_graph(edges.begin(), edges.end(), 
objects.size());
    +  // check cycle dependent
    +  bool has_cycle = false;
    +  cycle_detector detector(has_cycle);
    +  boost::depth_first_search(dependent_graph, boost::visitor(detector));
    +  if (has_cycle) {
    +    throw "type error: cycel dependent found in " + program_->get_path();
    --- End diff --
    
    Would be nice to know which type(s) are affected.


> python code generator dose not handle struct dependent
> ------------------------------------------------------
>
>                 Key: THRIFT-3783
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3783
>             Project: Thrift
>          Issue Type: Bug
>          Components: Python - Compiler
>            Reporter: Huabin
>            Priority: Minor
>
> given thrift idl
> {code}
> struct A {
> 1: B b,
> }
> struct B {
> 1: i32 b,
> }
> {code}
> generated ttypes.py
> {code}
> 20   class A:
>  21   """
>  22   Attributes:
>  23    - b
>  24   """
>  25  
>  26   thrift_spec = (
>  27     None, # 0
>  28     (1, TType.STRUCT, 'b', (B, B.thrift_spec), None, ), # 1
>  29   )
>  30  
> {code}
> import A will cause error since it referenced B, which has not be defined.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to