@@ -114,13 +114,14 @@ class InvalidWasmError(BaseException):
114114
115115Section = namedtuple ('Section' , ['type' , 'size' , 'offset' , 'name' ])
116116Limits = namedtuple ('Limits' , ['flags' , 'initial' , 'maximum' ])
117- Import = namedtuple ('Import' , ['kind' , 'module' , 'field' ])
117+ Import = namedtuple ('Import' , ['kind' , 'module' , 'field' , 'type' ])
118118Export = namedtuple ('Export' , ['name' , 'kind' , 'index' ])
119119Global = namedtuple ('Global' , ['type' , 'mutable' , 'init' ])
120120Dylink = namedtuple ('Dylink' , ['mem_size' , 'mem_align' , 'table_size' , 'table_align' , 'needed' , 'export_info' , 'import_info' ])
121121Table = namedtuple ('Table' , ['elem_type' , 'limits' ])
122122FunctionBody = namedtuple ('FunctionBody' , ['offset' , 'size' ])
123123DataSegment = namedtuple ('DataSegment' , ['flags' , 'init' , 'offset' , 'size' ])
124+ FuncType = namedtuple ('FuncType' , ['params' , 'returns' ])
124125
125126
126127class Module :
@@ -210,6 +211,27 @@ def sections(self):
210211 yield Section (section_type , section_size , section_offset , name )
211212 offset = section_offset + section_size
212213
214+ def get_types (self ):
215+ type_section = self .get_section (SecType .TYPE )
216+ if not type_section :
217+ return []
218+ self .seek (type_section .offset )
219+ num_types = self .readULEB ()
220+ types = []
221+ for i in range (num_types ):
222+ params = []
223+ returns = []
224+ type_form = self .readByte ()
225+ assert type_form == 0x60
226+ num_params = self .readULEB ()
227+ for j in range (num_params ):
228+ params .append (self .read_type ())
229+ num_returns = self .readULEB ()
230+ for j in range (num_returns ):
231+ returns .append (self .read_type ())
232+ types .append (FuncType (params , returns ))
233+ return types
234+
213235 def parse_features_section (self ):
214236 features = []
215237 sec = self .get_custom_section ('target_features' )
@@ -315,22 +337,23 @@ def get_imports(self):
315337 mod = self .readString ()
316338 field = self .readString ()
317339 kind = ExternType (self .readByte ())
318- imports . append ( Import ( kind , mod , field ))
340+ type_ = None
319341 if kind == ExternType .FUNC :
320- self .readULEB () # sig
342+ type_ = self .readULEB ()
321343 elif kind == ExternType .GLOBAL :
322- self .readSLEB () # global type
344+ type_ = self .readSLEB ()
323345 self .readByte () # mutable
324346 elif kind == ExternType .MEMORY :
325347 self .read_limits () # limits
326348 elif kind == ExternType .TABLE :
327- self .readSLEB () # table type
349+ type_ = self .readSLEB ()
328350 self .read_limits () # limits
329351 elif kind == ExternType .TAG :
330352 self .readByte () # attribute
331- self .readULEB () # sig
353+ type_ = self .readULEB ()
332354 else :
333355 assert False
356+ imports .append (Import (kind , mod , field , type_ ))
334357
335358 return imports
336359
0 commit comments