@@ -53,25 +53,25 @@ class AstParser(object):
5353 """Walk an AST and determine the members of all structs"""
5454
5555 def __init__ (self ):
56- self .__typedefs = {}
57- self .__typedecls = {}
58- self .__structs = {}
59- self .__struct_stack = []
60- self .__struct_members_stack = []
61- self .__ptr_decl_depth = 0
62- self .__struct_members = {}
63- self .__decl_names = {}
56+ self ._typedefs = {}
57+ self ._typedecls = {}
58+ self ._structs = {}
59+ self ._struct_stack = []
60+ self ._struct_members_stack = []
61+ self ._ptr_decl_depth = 0
62+ self ._struct_members = {}
63+ self ._decl_names = {}
6464
6565 def get_struct_members (self , name ):
6666 """return a list of (name, type) of struct members"""
67- defs = self .__typedefs .get (name )
67+ defs = self ._typedefs .get (name )
6868 if defs is None :
6969 return None
70- node = self .__get_leaf_node (defs )
70+ node = self ._get_leaf_node (defs )
7171 name = node .name
7272 if name is None :
7373 name = defs .declname
74- return self .__struct_members .get (name )
74+ return self ._struct_members .get (name )
7575
7676 def visit (self , node ):
7777 if isinstance (node , c_ast .FileAST ):
@@ -96,27 +96,27 @@ def visit_ast(self, ast):
9696 self .visit (node )
9797
9898 def visit_typedef (self , typedef ):
99- self .__typedefs [typedef .name ] = typedef .type
99+ self ._typedefs [typedef .name ] = typedef .type
100100 self .visit (typedef .type )
101101
102102 def visit_typedecl (self , typedecl ):
103- self .__decl_names [typedecl .type ] = typedecl .declname
103+ self ._decl_names [typedecl .type ] = typedecl .declname
104104 self .visit (typedecl .type )
105105
106106 def visit_struct (self , struct ):
107- self .__structs [self .__get_struct_name (struct )] = struct
108107 if struct .decls :
108+ self ._structs [self ._get_struct_name (struct )] = struct
109109 # recurse into the struct
110- self .__struct_stack .insert (0 , struct )
110+ self ._struct_stack .insert (0 , struct )
111111 for decl in struct .decls :
112- self .__struct_members_stack .insert (0 , decl .name )
112+ self ._struct_members_stack .insert (0 , decl .name )
113113 self .visit (decl )
114- self .__struct_members_stack .pop (0 )
115- self .__struct_stack .pop (0 )
116- elif self .__ptr_decl_depth :
114+ self ._struct_members_stack .pop (0 )
115+ self ._struct_stack .pop (0 )
116+ elif self ._ptr_decl_depth :
117117 # the struct is empty, but add it as a member to the current
118118 # struct as the current member maybe a pointer to it.
119- self .__add_struct_member (struct .name )
119+ self ._add_struct_member (struct .name )
120120
121121 def visit_decl (self , decl ):
122122 self .visit (decl .type )
@@ -125,51 +125,57 @@ def visit_funcdecl(self, funcdecl):
125125 self .visit (funcdecl .type )
126126
127127 def visit_ptrdecl (self , ptrdecl ):
128- self .__ptr_decl_depth += 1
128+ self ._ptr_decl_depth += 1
129129 self .visit (ptrdecl .type )
130- self .__ptr_decl_depth -= 1
130+ self ._ptr_decl_depth -= 1
131131
132132 def visit_identifier (self , identifier ):
133133 type_name = " " .join (identifier .names )
134- self .__add_struct_member (type_name )
134+ self ._add_struct_member (type_name )
135135
136- def __add_struct_member (self , type_name ):
137- if not (self .__struct_stack and self .__struct_members_stack ):
136+ def _add_struct_member (self , type_name ):
137+ if not (self ._struct_stack and self ._struct_members_stack ):
138138 return
139139
140140 # add member to current struct
141- current_struct = self .__struct_stack [0 ]
142- member_name = self .__struct_members_stack [0 ]
143- struct_members = self .__struct_members .setdefault (
144- self .__get_struct_name (current_struct ), [])
141+ current_struct = self ._struct_stack [0 ]
142+ member_name = self ._struct_members_stack [0 ]
143+ struct_members = self ._struct_members .setdefault (
144+ self ._get_struct_name (current_struct ), [])
145145
146146 # get the node associated with this type
147147 node = None
148- if type_name in self .__typedefs :
149- node = self .__get_leaf_node (self .__typedefs [type_name ])
150- elif type_name in self .__structs :
151- node = self .__structs [type_name ]
148+ if type_name in self ._typedefs :
149+ node = self ._get_leaf_node (self ._typedefs [type_name ])
150+ # If the struct was only declared when the typedef was created, its member
151+ # information will not have been recorded and we have to look it up in the
152+ # structs
153+ if isinstance (node , c_ast .Struct ) and node .decls is None :
154+ if node .name in self ._structs :
155+ node = self ._structs [node .name ]
156+ elif type_name in self ._structs :
157+ node = self ._structs [type_name ]
152158
153159 # If it's a struct (and not a pointer to a struct) expand
154160 # it into the current struct definition
155- if not self .__ptr_decl_depth and isinstance (node , c_ast .Struct ):
161+ if not self ._ptr_decl_depth and isinstance (node , c_ast .Struct ):
156162 for decl in node .decls or []:
157- self .__struct_members_stack .insert (0 , decl .name )
163+ self ._struct_members_stack .insert (0 , decl .name )
158164 self .visit (decl )
159- self .__struct_members_stack .pop (0 )
165+ self ._struct_members_stack .pop (0 )
160166 else :
161167 # otherwise add it as a single member
162168 struct_members .append ((member_name , type_name ))
163169
164- def __get_leaf_node (self , node ):
170+ def _get_leaf_node (self , node ):
165171 if isinstance (node , c_ast .Typedef ):
166- return self .__get_leaf_node (node .type )
172+ return self ._get_leaf_node (node .type )
167173 if isinstance (node , c_ast .TypeDecl ):
168- return self .__get_leaf_node (node .type )
174+ return self ._get_leaf_node (node .type )
169175 return node
170176
171- def __get_struct_name (self , node ):
172- return node .name or self .__decl_names .get (node ) or "_struct_%d" % id (node )
177+ def _get_struct_name (self , node ):
178+ return node .name or self ._decl_names .get (node ) or "_struct_%d" % id (node )
173179
174180
175181class Writer (object ):
0 commit comments