diff --git a/tools/building.py b/tools/building.py index c070e540636f1..1110f1dfb7bf7 100644 --- a/tools/building.py +++ b/tools/building.py @@ -114,7 +114,7 @@ def side_module_external_deps(external_symbols): sym = demangle_c_symbol_name(sym) if sym in external_symbols: deps = deps.union(external_symbols[sym]) - return sorted(list(deps)) + return sorted(deps) def create_stub_object(external_symbols): @@ -184,12 +184,11 @@ def lld_flags_for_executable(external_symbols): c_exports += side_module_external_deps(external_symbols) for export in c_exports: if settings.ERROR_ON_UNDEFINED_SYMBOLS: - cmd.append('--export=' + export) + cmd.append(f'--export={export}') else: - cmd.append('--export-if-defined=' + export) + cmd.append(f'--export-if-defined={export}') - for e in settings.EXPORT_IF_DEFINED: - cmd.append('--export-if-defined=' + e) + cmd.extend(f'--export-if-defined={e}' for e in settings.EXPORT_IF_DEFINED) if settings.RELOCATABLE: cmd.append('--experimental-pic') @@ -749,10 +748,10 @@ def minify_wasm_js(js_file, wasm_file, expensive_optimizations, debug_info): def is_internal_global(name): - internal_start_stop_symbols = set(['__start_em_asm', '__stop_em_asm', - '__start_em_js', '__stop_em_js', - '__start_em_lib_deps', '__stop_em_lib_deps', - '__em_lib_deps']) + internal_start_stop_symbols = {'__start_em_asm', '__stop_em_asm', + '__start_em_js', '__stop_em_js', + '__start_em_lib_deps', '__stop_em_lib_deps', + '__em_lib_deps'} internal_prefixes = ('__em_js__', '__em_lib_deps') return name in internal_start_stop_symbols or any(name.startswith(p) for p in internal_prefixes) diff --git a/tools/colored_logger.py b/tools/colored_logger.py index c891a616bb576..2802415a1ae55 100644 --- a/tools/colored_logger.py +++ b/tools/colored_logger.py @@ -99,9 +99,7 @@ def add_coloring_to_emit_ansi(fn): # add methods we need to the class def new(*args): levelno = args[1].levelno - if levelno >= 50: - color = '\x1b[31m' # red - elif levelno >= 40: + if levelno >= 40: color = '\x1b[31m' # red elif levelno >= 30: color = '\x1b[33m' # yellow diff --git a/tools/determinism_checker.py b/tools/determinism_checker.py index 952cdd9f8a625..03c63a52640c3 100644 --- a/tools/determinism_checker.py +++ b/tools/determinism_checker.py @@ -24,7 +24,7 @@ def run(): def write(data, subdir): if not os.path.exists(subdir): os.mkdir(subdir) - for relevant_file in data.keys(): + for relevant_file in data: Path(os.path.join(subdir, relevant_file)).write_text(data[relevant_file]) diff --git a/tools/emcoverage.py b/tools/emcoverage.py index d7d906d092de2..55d9d4aebd173 100755 --- a/tools/emcoverage.py +++ b/tools/emcoverage.py @@ -37,6 +37,7 @@ from glob import glob import coverage.cmdline # type: ignore +import contextlib SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -62,10 +63,8 @@ def main(): if sys.argv[1] in ('html', 'report', 'xml'): old_argv = sys.argv sys.argv = ['coverage', 'combine'] + glob(os.path.join(store, '*')) - try: + with contextlib.suppress(SystemExit): coverage.cmdline.main() - except SystemExit: - pass sys.argv = old_argv + ['-i'] return coverage.cmdline.main() diff --git a/tools/emdump.py b/tools/emdump.py index dd2c4cfb41517..089d2a288df4a 100755 --- a/tools/emdump.py +++ b/tools/emdump.py @@ -162,8 +162,8 @@ def merge_entry_to_existing(existing_data, new_entry, total_source_set_size): name = new_entry['unminified_name'] if name in existing_data: ex = existing_data[name] - num_times_occurs_1 = ex['num_times_occurs'] if 'num_times_occurs' in ex else 1 - num_times_occurs_2 = new_entry['num_times_occurs'] if 'num_times_occurs' in new_entry else 1 + num_times_occurs_1 = ex.get('num_times_occurs', 1) + num_times_occurs_2 = new_entry.get('num_times_occurs', 1) existing_data[name] = { 'lines': ex['lines'] + new_entry['lines'], 'bytes': ex['bytes'] + new_entry['bytes'], @@ -212,7 +212,7 @@ def analyze_javascript_file_contents(filename, file_contents, total_source_set_s if asm_start >= 0: asm_start_brace = file_contents.rfind('{', 0, asm_start) if asm_start_brace >= 0: - asm_end_brace = brace_map[asm_start_brace] if asm_start_brace in brace_map else file_len + asm_end_brace = brace_map.get(asm_start_brace, file_len) func_pos = -1 var_pos = -1 @@ -516,7 +516,7 @@ def print_symbol_info(data, total_source_set_size): continue if options.only_common and (not e['in_set_1'] or not e['in_set_2']): continue - prev_bytes = e['prev_bytes'] if 'prev_bytes' in e else 0 + prev_bytes = e.get('prev_bytes', 0) if max(e['bytes'], prev_bytes) < options.filter_size: continue if e['bytes'] == prev_bytes and options.only_changes: diff --git a/tools/emscripten.py b/tools/emscripten.py index a3e3fc4cd7046..9566ace8b95a0 100644 --- a/tools/emscripten.py +++ b/tools/emscripten.py @@ -225,7 +225,7 @@ def set_memory(static_bump): def report_missing_exports_wasm_only(metadata): if diagnostics.is_enabled('undefined'): - defined_symbols = set(asmjs_mangle(e) for e in metadata.all_exports) + defined_symbols = {asmjs_mangle(e) for e in metadata.all_exports} missing = set(settings.USER_EXPORTS) - defined_symbols for symbol in sorted(missing): diagnostics.warning('undefined', f'undefined exported symbol: "{symbol}"') @@ -235,7 +235,7 @@ def report_missing_exports(js_symbols): if diagnostics.is_enabled('undefined'): # Report any symbol that was explicitly exported but is present neither # as a native function nor as a JS library function. - defined_symbols = set(asmjs_mangle(e) for e in settings.WASM_EXPORTS).union(js_symbols) + defined_symbols = {asmjs_mangle(e) for e in settings.WASM_EXPORTS}.union(js_symbols) missing = set(settings.USER_EXPORTS) - defined_symbols for symbol in sorted(missing): diagnostics.warning('undefined', f'undefined exported symbol: "{symbol}"') @@ -699,15 +699,12 @@ def create_asm_consts(metadata): asm_consts = {} for addr, const in metadata.em_asm_consts.items(): body = trim_asm_const_body(const) - args = [] max_arity = 16 arity = 0 for i in range(max_arity): - if ('$' + str(i)) in const: + if f'${i}' in const: arity = i + 1 - for i in range(arity): - args.append('$' + str(i)) - args = ', '.join(args) + args = ', '.join(f'${i}' for i in range(arity)) if 'arguments' in body: # arrow functions don't bind `arguments` so we have to use # the old function syntax in this case @@ -717,8 +714,7 @@ def create_asm_consts(metadata): if settings.RELOCATABLE: addr += settings.GLOBAL_BASE asm_consts[addr] = func - asm_consts = [(key, value) for key, value in asm_consts.items()] - asm_consts.sort() + asm_consts = sorted(asm_consts.items()) return asm_consts @@ -836,10 +832,8 @@ def add_standard_wasm_imports(send_items_map): def create_sending(metadata, library_symbols): # Map of wasm imports to mangled/external/JS names - send_items_map = {} + send_items_map = {name: name for name in metadata.invoke_funcs} - for name in metadata.invoke_funcs: - send_items_map[name] = name for name in metadata.imports: if name in metadata.em_js_funcs: send_items_map[name] = name @@ -903,9 +897,7 @@ def install_wrapper(sym): # pthread_self and _emscripten_proxy_execute_task_queue are currently called in some # cases after the runtime has exited. # TODO: Look into removing these, and improving our robustness around thread termination. - if sym in ('__trap', 'pthread_self', '_emscripten_proxy_execute_task_queue'): - return False - return True + return sym not in {'__trap', 'pthread_self', '_emscripten_proxy_execute_task_queue'} for name, types in function_exports.items(): nargs = len(types.params) diff --git a/tools/experimental/reproduceriter.py b/tools/experimental/reproduceriter.py index 3d47bf895ed7c..2813a83b28896 100644 --- a/tools/experimental/reproduceriter.py +++ b/tools/experimental/reproduceriter.py @@ -125,7 +125,7 @@ window_location = sys.argv[4] if len(sys.argv) >= 5 else '' on_idle = sys.argv[5] if len(sys.argv) >= 6 else '' -shell = not not window_location +shell = bool(window_location) dirs_to_drop = 0 if not os.path.dirname(first_js) else len(os.path.dirname(first_js).split('/')) diff --git a/tools/file_packager.py b/tools/file_packager.py index 5c48543588d16..123462418bd44 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -172,10 +172,7 @@ def should_ignore(fullname): if has_hidden_attribute(fullname): return True - for p in excluded_patterns: - if fnmatch.fnmatch(fullname, p): - return True - return False + return any(fnmatch.fnmatch(fullname, p) for p in excluded_patterns) def add(mode, rootpathsrc, rootpathdst): diff --git a/tools/js_optimizer.py b/tools/js_optimizer.py index f201ee9edfb04..d7a158b338ea3 100755 --- a/tools/js_optimizer.py +++ b/tools/js_optimizer.py @@ -330,9 +330,7 @@ def write_chunk(chunk, i): with ToolchainProfiler.profile_block('sort_or_concat'): # sort functions by size, to make diffing easier and to improve aot times - funcses = [] - for out_file in filenames: - funcses.append(split_funcs(utils.read_file(out_file))) + funcses = [split_funcs(utils.read_file(out_file)) for out_file in filenames] funcs = [item for sublist in funcses for item in sublist] funcses = None if not os.environ.get('EMCC_NO_OPT_SORT'): diff --git a/tools/link.py b/tools/link.py index ed1a42d54a7da..dbd5e80967d2c 100644 --- a/tools/link.py +++ b/tools/link.py @@ -166,7 +166,7 @@ def will_metadce(): def setup_environment_settings(): # Environment setting based on user input environments = settings.ENVIRONMENT.split(',') - if any([x for x in environments if x not in VALID_ENVIRONMENTS]): + if any(x for x in environments if x not in VALID_ENVIRONMENTS): exit_with_error(f'Invalid environment specified in "ENVIRONMENT": {settings.ENVIRONMENT}. Should be one of: {",".join(VALID_ENVIRONMENTS)}') settings.ENVIRONMENT_MAY_BE_WEB = not settings.ENVIRONMENT or 'web' in environments @@ -216,8 +216,8 @@ def get_js_sym_info(): # and can contain full paths to temporary files. skip_settings = {'PRE_JS_FILES', 'POST_JS_FILES'} input_files = [json.dumps(settings.external_dict(skip_keys=skip_settings), sort_keys=True, indent=2)] - for jslib in sorted(glob.glob(utils.path_from_root('src') + '/library*.js')): - input_files.append(read_file(jslib)) + jslibs = glob.glob(utils.path_from_root('src') + '/library*.js') + input_files.extend(read_file(jslib) for jslib in sorted(jslibs)) for jslib in settings.JS_LIBRARIES: if not os.path.isabs(jslib): jslib = utils.path_from_root('src', jslib) @@ -622,7 +622,7 @@ def check_browser_versions(): if settings.LEGACY_VM_SUPPORT: # Default all browser versions to zero - for key in min_version_settings.keys(): + for key in min_version_settings: default_setting(key, 0) for key, oldest in min_version_settings.items(): @@ -964,9 +964,8 @@ def phase_linker_setup(options, state, newargs): if settings.MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION and settings.MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION: exit_with_error('MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION and MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION are mutually exclusive!') - if options.emrun: - if settings.MINIMAL_RUNTIME: - exit_with_error('--emrun is not compatible with MINIMAL_RUNTIME') + if options.emrun and settings.MINIMAL_RUNTIME: + exit_with_error('--emrun is not compatible with MINIMAL_RUNTIME') if options.use_closure_compiler: settings.USE_CLOSURE_COMPILER = 1 @@ -2939,7 +2938,7 @@ def process_dynamic_libs(dylibs, lib_dirs): dylibs += extras for dylib in dylibs: exports = webassembly.get_exports(dylib) - exports = set(e.name for e in exports) + exports = {e.name for e in exports} # EM_JS function are exports with a special prefix. We need to strip # this prefix to get the actual symbol name. For the main module, this # is handled by extract_metadata.py. @@ -2953,7 +2952,7 @@ def process_dynamic_libs(dylibs, lib_dirs): # TODO(sbc): Integrate with metadata.invoke_funcs that comes from the # main module to avoid creating new invoke functions at runtime. imports = set(imports) - imports = set(i for i in imports if not i.startswith('invoke_')) + imports = {i for i in imports if not i.startswith('invoke_')} weak_imports = webassembly.get_weak_imports(dylib) strong_imports = sorted(imports.difference(weak_imports)) logger.debug('Adding symbols requirements from `%s`: %s', dylib, imports) diff --git a/tools/maint/check_struct_info.py b/tools/maint/check_struct_info.py index 373f7e04c32bd..9b56823b1bb06 100755 --- a/tools/maint/check_struct_info.py +++ b/tools/maint/check_struct_info.py @@ -32,7 +32,7 @@ def check_structs(info): def check_defines(info): - for define in info['defines'].keys(): + for define in info['defines']: key = r'cDefs\.' + define + r'\>' # grep --quiet ruturns 0 when there is a match if subprocess.run(['git', 'grep', '--quiet', key], check=False).returncode != 0: diff --git a/tools/maint/gen_sig_info.py b/tools/maint/gen_sig_info.py index b9548b35f241d..742fbf2db2585 100755 --- a/tools/maint/gen_sig_info.py +++ b/tools/maint/gen_sig_info.py @@ -181,9 +181,7 @@ def ignore_symbol(s, cxx): 'stackSave', 'stackRestore', 'stackAlloc', 'getTempRet0', 'setTempRet0', }: return True - if cxx and s in ('__asctime_r') or s.startswith('__cxa_find_matching_catch'): - return True - return False + return cxx and s == '__asctime_r' or s.startswith('__cxa_find_matching_catch') def create_c_file(filename, symbol_list, header): @@ -263,7 +261,7 @@ def update_line(l): def remove_sigs(sig_info): print("removing __sig attributes ...") - to_remove = [f'{sym}__sig:' for sym in sig_info.keys()] + to_remove = [f'{sym}__sig:' for sym in sig_info] def strip_line(l): l = l.strip() @@ -362,12 +360,11 @@ def extract_sig_info(sig_info, extra_settings=None, extra_cflags=None, cxx=False assert sym in sig_info64 sig64 = sig_info64[sym] sig_string = functype_to_str(sig32, sig64) - if sym in sig_info: - if sig_info[sym] != sig_string: - print(sym) - print(sig_string) - print(sig_info[sym]) - assert sig_info[sym] == sig_string + if sym in sig_info and sig_info[sym] != sig_string: + print(sym) + print(sig_string) + print(sig_info[sym]) + assert sig_info[sym] == sig_string sig_info[sym] = sig_string diff --git a/tools/maint/gen_struct_info.py b/tools/maint/gen_struct_info.py index 7506de47ed7d5..70754f35d1b9d 100755 --- a/tools/maint/gen_struct_info.py +++ b/tools/maint/gen_struct_info.py @@ -205,8 +205,8 @@ def gen_inspect_code(path, struct, code): def generate_c_code(headers): code = ['#include ', '#include '] - for header in headers: - code.append('#include "' + header['name'] + '"') + + code.extend(f'''#include "{header['name']}"''' for header in headers) code.append('int main() {') c_descent('structs', code) @@ -220,13 +220,13 @@ def generate_c_code(headers): for name, type_ in header['defines'].items(): # Add the necessary python type, if missing. if '%' not in type_: - if type_[-1] in ('d', 'i', 'u'): + if type_[-1] in {'d', 'i', 'u'}: # integer type_ = 'i%' + type_ - elif type_[-1] in ('f', 'F', 'e', 'E', 'g', 'G'): + elif type_[-1] in {'f', 'F', 'e', 'E', 'g', 'G'}: # float type_ = 'f%' + type_ - elif type_[-1] in ('x', 'X', 'a', 'A', 'c', 's'): + elif type_[-1] in {'x', 'X', 'a', 'A', 'c', 's'}: # hexadecimal or string type_ = 's%' + type_ @@ -343,7 +343,7 @@ def parse_json(path): data = [data] for item in data: - for key in item.keys(): + for key in item: if key not in ['file', 'defines', 'structs']: raise 'Unexpected key in json file: %s' % key diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index 40b2fa8d42d1a..c2d47ba6e96e2 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -116,10 +116,10 @@ def get_all_files_under(dirname): def dir_is_newer(dir_a, dir_b): assert os.path.exists(dir_a) assert os.path.exists(dir_b) - files_a = [(x, os.path.getmtime(x)) for x in get_all_files_under(dir_a)] - files_b = [(x, os.path.getmtime(x)) for x in get_all_files_under(dir_b)] - newest_a = max([f for f in files_a], key=lambda f: f[1]) - newest_b = max([f for f in files_b], key=lambda f: f[1]) + files_a = ((x, os.path.getmtime(x)) for x in get_all_files_under(dir_a)) + files_b = ((x, os.path.getmtime(x)) for x in get_all_files_under(dir_b)) + newest_a = max(files_a, key=lambda f: f[1]) + newest_b = max(files_b, key=lambda f: f[1]) logger.debug('newest_a: %s %s', *newest_a) logger.debug('newest_b: %s %s', *newest_b) return newest_a[1] > newest_b[1] @@ -326,10 +326,7 @@ def unpack(): utils.write_file(marker, url + '\n') def up_to_date(): - if os.path.exists(marker): - if utils.read_file(marker).strip() == url: - return True - return False + return os.path.exists(marker) and utils.read_file(marker).strip() == url # before acquiring the lock we have an early out if the port already exists if up_to_date(): @@ -372,7 +369,7 @@ def write_file(filename, contents): class OrderedSet: """Partial implementation of OrderedSet. Just enough for what we need here.""" def __init__(self, items): - self.dict = dict() + self.dict = {} for i in items: self.dict[i] = True diff --git a/tools/ports/sdl2_image.py b/tools/ports/sdl2_image.py index 70fa1499a4240..e36344eeddc21 100644 --- a/tools/ports/sdl2_image.py +++ b/tools/ports/sdl2_image.py @@ -66,8 +66,7 @@ def create(final): formats = get_formats(settings) - for fmt in formats: - flags.append('-DLOAD_' + fmt.upper()) + flags.extend(f'-DLOAD_{fmt.upper()}' for fmt in formats) if 'png' in formats: flags += ['-sUSE_LIBPNG'] diff --git a/tools/shared.py b/tools/shared.py index ea92f9f8fb469..b6cc824a0f020 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -47,6 +47,7 @@ from . import filelock from . import utils from .settings import settings +import contextlib DEBUG_SAVE = DEBUG or int(os.environ.get('EMCC_DEBUG_SAVE', '0')) @@ -493,10 +494,8 @@ def sanity_is_correct(): # We can't simply check for the existence of sanity_file and then read from # it here because we don't hold the cache lock yet and some other process # could clear the cache between checking for, and reading from, the file. - try: + with contextlib.suppress(Exception): sanity_data = utils.read_file(sanity_file) - except Exception: - pass if sanity_data == expected: logger.debug(f'sanity file up-to-date: {sanity_file}') # Even if the sanity file is up-to-date we still run the checks diff --git a/tools/system_libs.py b/tools/system_libs.py index 29d1a68f6ae36..582d19ba21148 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -502,7 +502,7 @@ def build_objects(self, build_dir): case_insensitive = is_case_insensitive(build_dir) for src in self.get_files(): ext = shared.suffix(src) - if ext in ('.s', '.S', '.c'): + if ext in {'.s', '.S', '.c'}: cmd = shared.EMCC else: cmd = shared.EMXX diff --git a/tools/toolchain_profiler.py b/tools/toolchain_profiler.py index 92ecd2a8c5eb2..0bfc1c8d7121a 100644 --- a/tools/toolchain_profiler.py +++ b/tools/toolchain_profiler.py @@ -152,7 +152,7 @@ def escape_string(arg): @staticmethod def escape_args(args): - return map(lambda arg: ToolchainProfiler.escape_string(arg), args) + return [ToolchainProfiler.escape_string(arg) for arg in args] @staticmethod def record_process_start(write_log_entry=True): diff --git a/tools/webassembly.py b/tools/webassembly.py index 4d846a7006fde..898d33e35b997 100644 --- a/tools/webassembly.py +++ b/tools/webassembly.py @@ -292,15 +292,11 @@ def get_types(self): type_form = self.read_byte() assert type_form == 0x60 - params = [] num_params = self.read_uleb() - for _ in range(num_params): - params.append(self.read_type()) + params = [self.read_type() for _ in range(num_params)] - returns = [] num_returns = self.read_uleb() - for _ in range(num_returns): - returns.append(self.read_type()) + returns = [self.read_type() for _ in range(num_returns)] types.append(FuncType(params, returns)) @@ -524,10 +520,7 @@ def get_function_types(self): self.seek(function_section.offset) num_types = self.read_uleb() - func_types = [] - for _ in range(num_types): - func_types.append(self.read_uleb()) - return func_types + return [self.read_uleb() for _ in range(num_types)] def has_name_section(self): return self.get_custom_section('name') is not None diff --git a/tools/webidl_binder.py b/tools/webidl_binder.py index e5ccd2a52655f..b8a152608a324 100644 --- a/tools/webidl_binder.py +++ b/tools/webidl_binder.py @@ -454,10 +454,7 @@ def is_ptr_arg(i): return (t.isArray() or t.isAny() or t.isString() or t.isObject() or t.isInterface()) for i, (js_arg, arg) in enumerate(zip(args, all_args)): - if i >= min_args: - optional = True - else: - optional = False + optional = i >= min_args do_default = False # Filter out arguments we don't know how to parse. Fast casing only common cases. compatible_arg = isinstance(arg, Dummy) or (isinstance(arg, WebIDL.IDLArgument) and arg.optional is False)