@@ -264,25 +264,32 @@ def get_tag_exports(module):
264
264
return rtn
265
265
266
266
267
- def update_metadata (filename , metadata ):
268
- imports = []
269
- invoke_funcs = []
270
- with webassembly .Module (filename ) as module :
271
- for i in module .get_imports ():
272
- if i .kind == webassembly .ExternType .FUNC :
273
- if i .field .startswith ('invoke_' ):
274
- invoke_funcs .append (i .field )
275
- else :
276
- imports .append (i .field )
277
- elif i .kind in (webassembly .ExternType .GLOBAL , webassembly .ExternType .TAG ):
267
+ def read_module_imports (module , metadata ):
268
+ em_js_funcs = metadata .em_js_funcs
269
+ types = module .get_types ()
270
+
271
+ imports = metadata .imports = []
272
+ invoke_funcs = metadata .invoke_funcs = []
273
+ em_js_func_types = metadata .em_js_func_types = {}
274
+
275
+ for i in module .get_imports ():
276
+ if i .kind == webassembly .ExternType .FUNC :
277
+ if i .field .startswith ('invoke_' ):
278
+ invoke_funcs .append (i .field )
279
+ else :
280
+ if i .field in em_js_funcs :
281
+ em_js_func_types [i .field ] = types [i .type ]
278
282
imports .append (i .field )
283
+ elif i .kind in (webassembly .ExternType .GLOBAL , webassembly .ExternType .TAG ):
284
+ imports .append (i .field )
279
285
286
+
287
+ def update_metadata (filename , metadata ):
288
+ with webassembly .Module (filename ) as module :
280
289
metadata .function_exports = get_function_exports (module )
281
290
metadata .tag_exports = get_tag_exports (module )
282
291
metadata .all_exports = [utils .removeprefix (e .name , '__em_js__' ) for e in module .get_exports ()]
283
-
284
- metadata .imports = imports
285
- metadata .invoke_funcs = invoke_funcs
292
+ read_module_imports (module , metadata )
286
293
287
294
288
295
def get_string_at (module , address ):
@@ -298,25 +305,24 @@ class Metadata:
298
305
em_asm_consts : Dict [int , str ]
299
306
js_deps : List [str ]
300
307
em_js_funcs : Dict [str , str ]
301
- em_js_func_types : Dict [str , str ]
308
+ em_js_func_types : Dict [str , webassembly . FuncType ]
302
309
features : List [str ]
303
310
invoke_funcs : List [str ]
304
311
main_reads_params : bool
305
- global_exports : List [str ]
312
+ global_exports : Dict [str , str ]
313
+ function_exports : Dict [str , webassembly .FuncType ]
314
+ tag_exports : List [str ]
315
+ all_exports : List [str ]
306
316
307
317
def __init__ (self ):
308
318
pass
309
319
310
320
311
321
def extract_metadata (filename ):
312
- import_names = []
313
- invoke_funcs = []
314
322
em_js_funcs = {}
315
- em_js_func_types = {}
316
323
317
324
with webassembly .Module (filename ) as module :
318
325
exports = module .get_exports ()
319
- imports = module .get_imports ()
320
326
321
327
export_map = {e .name : e for e in exports }
322
328
for e in exports :
@@ -326,18 +332,6 @@ def extract_metadata(filename):
326
332
string_address = to_unsigned (get_global_value (globl ))
327
333
em_js_funcs [name ] = get_string_at (module , string_address )
328
334
329
- for i in imports :
330
- if i .kind == webassembly .ExternType .FUNC :
331
- if i .field .startswith ('invoke_' ):
332
- invoke_funcs .append (i .field )
333
- else :
334
- if i .field in em_js_funcs :
335
- types = module .get_types ()
336
- em_js_func_types [i .field ] = types [i .type ]
337
- import_names .append (i .field )
338
- elif i .kind in (webassembly .ExternType .GLOBAL , webassembly .ExternType .TAG ):
339
- import_names .append (i .field )
340
-
341
335
features = module .parse_features_section ()
342
336
features = ['--enable-' + f [1 ] for f in features if f [0 ] == '+' ]
343
337
features = [f .replace ('--enable-atomics' , '--enable-threads' ) for f in features ]
@@ -347,18 +341,17 @@ def extract_metadata(filename):
347
341
# If main does not read its parameters, it will just be a stub that
348
342
# calls __original_main (which has no parameters).
349
343
metadata = Metadata ()
350
- metadata .imports = import_names
351
344
metadata .function_exports = get_function_exports (module )
352
345
metadata .tag_exports = get_tag_exports (module )
353
346
metadata .all_exports = [utils .removeprefix (e .name , '__em_js__' ) for e in exports ]
354
347
metadata .em_asm_consts = get_section_strings (module , export_map , 'em_asm' )
355
348
metadata .js_deps = [d for d in get_section_strings (module , export_map , 'em_lib_deps' ).values () if d ]
356
349
metadata .em_js_funcs = em_js_funcs
357
- metadata .em_js_func_types = em_js_func_types
358
350
metadata .features = features
359
- metadata .invoke_funcs = invoke_funcs
360
351
metadata .main_reads_params = get_main_reads_params (module , export_map )
361
352
metadata .global_exports = get_global_exports (module , exports )
362
353
354
+ read_module_imports (module , metadata )
355
+
363
356
# print("Metadata parsed: " + pprint.pformat(metadata))
364
357
return metadata
0 commit comments