@@ -53,25 +53,25 @@ class AstParser(object):
53
53
"""Walk an AST and determine the members of all structs"""
54
54
55
55
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 = {}
64
64
65
65
def get_struct_members (self ,name ):
66
66
"""return a list of (name, type) of struct members"""
67
- defs = self .__typedefs .get (name )
67
+ defs = self ._typedefs .get (name )
68
68
if defs is None :
69
69
return None
70
- node = self .__get_leaf_node (defs )
70
+ node = self ._get_leaf_node (defs )
71
71
name = node .name
72
72
if name is None :
73
73
name = defs .declname
74
- return self .__struct_members .get (name )
74
+ return self ._struct_members .get (name )
75
75
76
76
def visit (self ,node ):
77
77
if isinstance (node ,c_ast .FileAST ):
@@ -96,27 +96,27 @@ def visit_ast(self, ast):
96
96
self .visit (node )
97
97
98
98
def visit_typedef (self ,typedef ):
99
- self .__typedefs [typedef .name ]= typedef .type
99
+ self ._typedefs [typedef .name ]= typedef .type
100
100
self .visit (typedef .type )
101
101
102
102
def visit_typedecl (self ,typedecl ):
103
- self .__decl_names [typedecl .type ]= typedecl .declname
103
+ self ._decl_names [typedecl .type ]= typedecl .declname
104
104
self .visit (typedecl .type )
105
105
106
106
def visit_struct (self ,struct ):
107
- self .__structs [self .__get_struct_name (struct )]= struct
108
107
if struct .decls :
108
+ self ._structs [self ._get_struct_name (struct )]= struct
109
109
# recurse into the struct
110
- self .__struct_stack .insert (0 ,struct )
110
+ self ._struct_stack .insert (0 ,struct )
111
111
for decl in struct .decls :
112
- self .__struct_members_stack .insert (0 ,decl .name )
112
+ self ._struct_members_stack .insert (0 ,decl .name )
113
113
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 :
117
117
# the struct is empty, but add it as a member to the current
118
118
# struct as the current member maybe a pointer to it.
119
- self .__add_struct_member (struct .name )
119
+ self ._add_struct_member (struct .name )
120
120
121
121
def visit_decl (self ,decl ):
122
122
self .visit (decl .type )
@@ -125,51 +125,57 @@ def visit_funcdecl(self, funcdecl):
125
125
self .visit (funcdecl .type )
126
126
127
127
def visit_ptrdecl (self ,ptrdecl ):
128
- self .__ptr_decl_depth += 1
128
+ self ._ptr_decl_depth += 1
129
129
self .visit (ptrdecl .type )
130
- self .__ptr_decl_depth -= 1
130
+ self ._ptr_decl_depth -= 1
131
131
132
132
def visit_identifier (self ,identifier ):
133
133
type_name = " " .join (identifier .names )
134
- self .__add_struct_member (type_name )
134
+ self ._add_struct_member (type_name )
135
135
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 ):
138
138
return
139
139
140
140
# 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 ), [])
145
145
146
146
# get the node associated with this type
147
147
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 ]
152
158
153
159
# If it's a struct (and not a pointer to a struct) expand
154
160
# 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 ):
156
162
for decl in node .decls or []:
157
- self .__struct_members_stack .insert (0 ,decl .name )
163
+ self ._struct_members_stack .insert (0 ,decl .name )
158
164
self .visit (decl )
159
- self .__struct_members_stack .pop (0 )
165
+ self ._struct_members_stack .pop (0 )
160
166
else :
161
167
# otherwise add it as a single member
162
168
struct_members .append ((member_name ,type_name ))
163
169
164
- def __get_leaf_node (self ,node ):
170
+ def _get_leaf_node (self ,node ):
165
171
if isinstance (node ,c_ast .Typedef ):
166
- return self .__get_leaf_node (node .type )
172
+ return self ._get_leaf_node (node .type )
167
173
if isinstance (node ,c_ast .TypeDecl ):
168
- return self .__get_leaf_node (node .type )
174
+ return self ._get_leaf_node (node .type )
169
175
return node
170
176
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 )
173
179
174
180
175
181
class Writer (object ):