@@ -52,7 +52,9 @@ def _pfp__init(self, stream):
52
52
self ._pfp__node .args , scope , self , None
53
53
)
54
54
param_list = params .instantiate (scope , struct_args , self ._pfp__interp )
55
- super (self .__class__ , self )._pfp__init (stream )
55
+
56
+ if hasattr (super (self .__class__ , self ), "_pfp__init" ):
57
+ super (self .__class__ , self )._pfp__init (stream )
56
58
57
59
new_class = type (
58
60
struct_cls .__name__ + "_" , (struct_cls ,), {"_pfp__init" : _pfp__init }
@@ -84,13 +86,28 @@ def StructUnionTypeRef(curr_scope, typedef_name, refd_name, interp, node):
84
86
elif isinstance (node , AST .Union ):
85
87
cls = fields .Union
86
88
87
- def __new__ (self , * args , ** kwargs ):
89
+ def __new__ (cls_ , * args , ** kwargs ):
88
90
refd_type = curr_scope .get_type (refd_name )
89
91
if refd_type is None :
90
92
refd_node = node
91
93
else :
92
94
refd_node = refd_type ._pfp__node
93
- return StructUnionDef (typedef_name , interp , refd_node )(* args , ** kwargs )
95
+
96
+ def merged_init (self , stream ):
97
+ if six .PY3 :
98
+ cls_ ._pfp__init (self , stream )
99
+ else :
100
+ cls_ ._pfp__init .__func__ (self , stream )
101
+ self ._pfp__init_orig (stream )
102
+
103
+ overrides = {}
104
+ if hasattr (cls_ , "_pfp__init" ):
105
+ overrides ["_pfp__init" ] = merged_init
106
+
107
+ res = base_cls = StructUnionDef (
108
+ typedef_name , interp , refd_node , overrides = overrides ,
109
+ )
110
+ return res (* args , ** kwargs )
94
111
95
112
new_class = type (
96
113
typedef_name ,
@@ -102,13 +119,16 @@ def __new__(self, *args, **kwargs):
102
119
return new_class
103
120
104
121
105
-
106
- def StructUnionDef (typedef_name , interp , node ):
122
+ def StructUnionDef (typedef_name , interp , node , overrides = None , cls = None ):
123
+ if overrides is None :
124
+ overrides = {}
107
125
if isinstance (node , AST .Struct ):
108
- cls = fields .Struct
126
+ if cls is None :
127
+ cls = fields .Struct
109
128
decls = StructDecls (node .decls , node .coord )
110
129
elif isinstance (node , AST .Union ):
111
- cls = fields .Union
130
+ if cls is None :
131
+ cls = fields .Union
112
132
decls = UnionDecls (node .decls , node .coord )
113
133
114
134
# this is so that we can have all nested structs added to
@@ -117,23 +137,34 @@ def StructUnionDef(typedef_name, interp, node):
117
137
# the new struct to not be added to its parent, and the user would
118
138
# not be able to see how far the script got
119
139
def __init__ (self , stream = None , metadata_processor = None , do_init = True ):
120
- cls .__init__ (self , stream , metadata_processor = metadata_processor )
140
+ cls .__init__ (
141
+ self ,
142
+ stream ,
143
+ metadata_processor = metadata_processor ,
144
+ )
121
145
122
146
if do_init :
123
147
self ._pfp__init (stream )
124
148
125
149
def _pfp__init (self , stream ):
126
150
self ._pfp__interp ._handle_node (decls , ctxt = self , stream = stream )
127
151
152
+ cls_members = {
153
+ "__init__" : __init__ ,
154
+ "_pfp__init" : _pfp__init ,
155
+ "_pfp__node" : node ,
156
+ "_pfp__interp" : interp ,
157
+ }
158
+
159
+ for k , v in six .iteritems (overrides or {}):
160
+ if k in cls_members :
161
+ cls_members [k + "_orig" ] = cls_members [k ]
162
+ cls_members [k ] = v
163
+
128
164
new_class = type (
129
165
typedef_name ,
130
166
(cls ,),
131
- {
132
- "__init__" : __init__ ,
133
- "_pfp__init" : _pfp__init ,
134
- "_pfp__node" : node ,
135
- "_pfp__interp" : interp ,
136
- },
167
+ cls_members ,
137
168
)
138
169
return new_class
139
170
0 commit comments