[
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)