def enum_func(module_bytecode): ''' return a list of Function see:: octopus.core.function ''' functions = list() analyzer = WasmModuleAnalyzer(module_bytecode) protos = analyzer.func_prototypes import_len = len(analyzer.imports_func) for idx, code in enumerate(analyzer.codes): # get corresponding function prototype name, param_str, return_str, _ = protos[import_len + idx] name = format_func_name(name, param_str, return_str) instructions = WasmDisassembler().disassemble(code) cur_function = Function(0, instructions[0], name=name) cur_function.instructions = instructions functions.append(cur_function) return functions
def extract_functions_code(self, module_bytecode): functions = list() mod_iter = iter(decode_module(module_bytecode)) _, _ = next(mod_iter) sections = list(mod_iter) # iterate over all section #code_data = [cur_sec_data for cur_sec, cur_sec_data in sections if isinstance(cur_sec_data.get_decoder_meta()['types']['payload'], CodeSection)][0] for cur_sec, cur_sec_data in sections: sec = cur_sec_data.get_decoder_meta()['types']['payload'] if isinstance(sec, CodeSection): code_data = cur_sec_data break if not code_data: raise ValueError('No functions/codes in the module') for idx, func in enumerate(code_data.payload.bodies): instructions = self.disassemble(func.code.tobytes()) cur_function = Function(0, instructions[0]) cur_function.instructions = instructions functions.append(cur_function) return functions