Modernize python and update pylint (#5096)
Update code to conform to the newer version of pylint available in
ubuntu-22.04, with few exceptions:
- disabled `import-outside-toplevel` for `main()` in
`jerry_client.py`
- disabled `consider-using-with` for the logfile of `TestSuite` in
`test262-harness.py` as using `with` is not practical in that case
Update test262-harness.py to use argparse instead of the now deprecated
optparse
Rename variables in jerry_client_main.py that redefined python builtins
or shadowed variables from an outer scope
Update python files to use f-stirngs
Add minimum python versions (3.6 and 3.8) to the CI jobs: without it the
default python version did not support the `with` statement for
`subprocess.Popen` used in `build.py` on macos, or in some cases f-stirngs
Remove `from __future__` imports that are no-ops in python 3
Remove shebang from non executable files
Re-enable most pylint checkers, except `missing-docstring`
JerryScript-DCO-1.0-Signed-off-by: Máté Tokodi mate.tokodi@szteszoftver.hu
This commit is contained in:
+42
-59
@@ -14,8 +14,6 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
try:
|
||||
from configparser import ConfigParser
|
||||
except ImportError:
|
||||
@@ -23,13 +21,14 @@ except ImportError:
|
||||
|
||||
import argparse
|
||||
import fileinput
|
||||
import subprocess
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from settings import FORMAT_SCRIPT, PROJECT_DIR
|
||||
|
||||
from gen_c_source import LICENSE
|
||||
|
||||
MAGIC_STRINGS_INI = os.path.join(PROJECT_DIR, 'jerry-core', 'lit', 'lit-magic-strings.ini')
|
||||
MAGIC_STRINGS_INC_H = os.path.join(PROJECT_DIR, 'jerry-core', 'lit', 'lit-magic-strings.inc.h')
|
||||
@@ -42,6 +41,7 @@ PARSER_ERRORS_INC_H = os.path.join(PROJECT_DIR, 'jerry-core', 'parser', 'js', 'p
|
||||
|
||||
LIMIT_MAGIC_STR_LENGTH = 255
|
||||
|
||||
|
||||
def debug_dump(obj):
|
||||
def deepcopy(obj):
|
||||
if isinstance(obj, (list, tuple)):
|
||||
@@ -51,6 +51,7 @@ def debug_dump(obj):
|
||||
if isinstance(obj, dict):
|
||||
return {repr(k): deepcopy(e) for k, e in obj.items()}
|
||||
return obj
|
||||
|
||||
return json.dumps(deepcopy(obj), indent=4)
|
||||
|
||||
|
||||
@@ -64,7 +65,7 @@ def read_magic_string_defs(debug, ini_path, item_name):
|
||||
# [('LIT_MAGIC_STRING_xxx', 'vvv'), ...]
|
||||
# sorted by length and alpha.
|
||||
ini_parser = ConfigParser()
|
||||
ini_parser.optionxform = str # case sensitive options (magic string IDs)
|
||||
ini_parser.optionxform = str # case sensitive options (magic string IDs)
|
||||
ini_parser.read(ini_path)
|
||||
|
||||
defs = [(str_ref, json.loads(str_value) if str_value != '' else '')
|
||||
@@ -73,13 +74,12 @@ def read_magic_string_defs(debug, ini_path, item_name):
|
||||
|
||||
if len(defs[-1][1]) > LIMIT_MAGIC_STR_LENGTH:
|
||||
for str_ref, str_value in [x for x in defs if len(x[1]) > LIMIT_MAGIC_STR_LENGTH]:
|
||||
print("error: The maximum allowed magic string size is {limit} but {str_ref} is {str_len} long.".format(
|
||||
limit=LIMIT_MAGIC_STR_LENGTH, str_ref=str_ref, str_len=len(str_value)))
|
||||
exit(1)
|
||||
print(f"error: The maximum allowed magic string size is "
|
||||
f"{LIMIT_MAGIC_STR_LENGTH} but {str_ref} is {len(str_value)} long.")
|
||||
sys.exit(1)
|
||||
|
||||
if debug:
|
||||
print('debug: magic string definitions: {dump}'
|
||||
.format(dump=debug_dump(defs)))
|
||||
print(f'debug: magic string definitions: {debug_dump(defs)}')
|
||||
|
||||
return defs
|
||||
|
||||
@@ -93,12 +93,12 @@ def extract_magic_string_refs(debug, pattern, inc_h_filename):
|
||||
# = [('zzz.c', 123), ...]
|
||||
# meaning that the given literal is referenced under the given guards at
|
||||
# the listed (file, line number) locations.
|
||||
exception_list = ['%s_DEF' % pattern,
|
||||
'%s_FIRST_STRING_WITH_SIZE' % pattern,
|
||||
'%s_LENGTH_LIMIT' % pattern,
|
||||
'%s__COUNT' % pattern]
|
||||
exception_list = [f'{pattern}_DEF',
|
||||
f'{pattern}_FIRST_STRING_WITH_SIZE',
|
||||
f'{pattern}_LENGTH_LIMIT',
|
||||
f'{pattern}__COUNT']
|
||||
|
||||
for str_ref in re.findall('%s_[a-zA-Z0-9_]+' % pattern, line):
|
||||
for str_ref in re.findall(f'{pattern}_[a-zA-Z0-9_]+', line):
|
||||
if str_ref in exception_list:
|
||||
continue
|
||||
|
||||
@@ -144,11 +144,11 @@ def extract_magic_string_refs(debug, pattern, inc_h_filename):
|
||||
guard_stack.append([process_guard(if_match.group(1))])
|
||||
elif elif_match is not None:
|
||||
guards = guard_stack[-1]
|
||||
guards[-1] = '!(%s)' % guards[-1].strip()
|
||||
guards[-1] = f'!({guards[-1].strip()})'
|
||||
guards.append(process_guard(elif_match.group(1)))
|
||||
elif else_match is not None:
|
||||
guards = guard_stack[-1]
|
||||
guards[-1] = '!(%s)' % guards[-1].strip()
|
||||
guards[-1] = f'!({guards[-1].strip()})'
|
||||
elif endif_match is not None:
|
||||
guard_stack.pop()
|
||||
|
||||
@@ -156,20 +156,18 @@ def extract_magic_string_refs(debug, pattern, inc_h_filename):
|
||||
process_line(fname, lnum, line, guard_stack, pattern)
|
||||
|
||||
if guard_stack:
|
||||
print('warning: {fname}: unbalanced preprocessor conditional '
|
||||
'directives (analysis finished with no closing `#endif` '
|
||||
'for {guard_stack})'
|
||||
.format(fname=fname, guard_stack=guard_stack))
|
||||
print(f'warning: {fname}: unbalanced preprocessor conditional '
|
||||
f'directives (analysis finished with no closing `#endif` '
|
||||
f'for {guard_stack})')
|
||||
|
||||
for root, _, files in os.walk(os.path.join(PROJECT_DIR, 'jerry-core')):
|
||||
for fname in files:
|
||||
if (fname.endswith('.c') or fname.endswith('.h')) \
|
||||
and fname != inc_h_filename:
|
||||
and fname != inc_h_filename:
|
||||
process_file(os.path.join(root, fname), pattern)
|
||||
|
||||
if debug:
|
||||
print('debug: magic string references: {dump}'
|
||||
.format(dump=debug_dump(results)))
|
||||
print(f'debug: magic string references: {debug_dump(results)}')
|
||||
|
||||
return results
|
||||
|
||||
@@ -179,8 +177,7 @@ def calculate_magic_string_guards(defs, uses, debug=False):
|
||||
|
||||
for str_ref, str_value in defs:
|
||||
if str_ref not in uses:
|
||||
print('warning: unused magic string {str_ref}'
|
||||
.format(str_ref=str_ref))
|
||||
print(f'warning: unused magic string {str_ref}')
|
||||
continue
|
||||
|
||||
# Calculate the most compact guard, i.e., if a magic string is
|
||||
@@ -208,8 +205,7 @@ def calculate_magic_string_guards(defs, uses, debug=False):
|
||||
extended_defs.append((str_ref, str_value, guards))
|
||||
|
||||
if debug:
|
||||
print('debug: magic string definitions (with guards): {dump}'
|
||||
.format(dump=debug_dump(extended_defs)))
|
||||
print(f'debug: magic string definitions (with guards): {debug_dump(extended_defs)}')
|
||||
|
||||
return extended_defs
|
||||
|
||||
@@ -220,25 +216,11 @@ def guards_to_str(guards):
|
||||
|
||||
|
||||
def generate_header(gen_file, ini_path):
|
||||
header = \
|
||||
"""/* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
header = f"""{LICENSE}
|
||||
|
||||
/* This file is automatically generated by the %s script
|
||||
* from %s. Do not edit! */
|
||||
""" % (os.path.basename(__file__), os.path.basename(ini_path))
|
||||
/* This file is automatically generated by the {os.path.basename(__file__)} script
|
||||
* from {os.path.basename(ini_path)}. Do not edit! */
|
||||
"""
|
||||
print(header, file=gen_file)
|
||||
|
||||
|
||||
@@ -247,21 +229,20 @@ def generate_magic_string_defs(gen_file, defs, def_macro):
|
||||
for str_ref, str_value, guards in defs:
|
||||
if last_guards != guards:
|
||||
if () not in last_guards:
|
||||
print('#endif /* {guards} */'.format(guards=guards_to_str(last_guards)), file=gen_file)
|
||||
print(f'#endif /* {guards_to_str(last_guards)} */', file=gen_file)
|
||||
if () not in guards:
|
||||
print('#if {guards}'.format(guards=guards_to_str(guards)), file=gen_file)
|
||||
print(f'#if {guards_to_str(guards)}', file=gen_file)
|
||||
|
||||
print('{macro} ({str_ref}, {str_value})'
|
||||
.format(macro=def_macro, str_ref=str_ref, str_value=json.dumps(str_value)), file=gen_file)
|
||||
print(f'{def_macro} ({str_ref}, {json.dumps(str_value)})', file=gen_file)
|
||||
|
||||
last_guards = guards
|
||||
|
||||
if () not in last_guards:
|
||||
print('#endif /* {guards} */'.format(guards=guards_to_str(last_guards)), file=gen_file)
|
||||
print(f'#endif /* {guards_to_str(last_guards)} */', file=gen_file)
|
||||
|
||||
|
||||
def generate_first_magic_strings(gen_file, defs, with_size_macro):
|
||||
print(file=gen_file) # empty line separator
|
||||
print(file=gen_file) # empty line separator
|
||||
|
||||
max_size = len(defs[-1][1])
|
||||
for size in range(max_size + 1):
|
||||
@@ -269,16 +250,15 @@ def generate_first_magic_strings(gen_file, defs, with_size_macro):
|
||||
for str_ref, str_value, guards in defs:
|
||||
if len(str_value) >= size:
|
||||
if () not in guards and () in last_guards:
|
||||
print('#if {guards}'.format(guards=guards_to_str(guards)), file=gen_file)
|
||||
print(f'#if {guards_to_str(guards)}', file=gen_file)
|
||||
elif () not in guards and () not in last_guards:
|
||||
if guards == last_guards:
|
||||
continue
|
||||
print('#elif {guards}'.format(guards=guards_to_str(guards)), file=gen_file)
|
||||
print(f'#elif {guards_to_str(guards)}', file=gen_file)
|
||||
elif () in guards and () not in last_guards:
|
||||
print('#else /* !({guards}) */'.format(guards=guards_to_str(last_guards)), file=gen_file)
|
||||
print(f'#else /* !({guards_to_str(last_guards)}) */', file=gen_file)
|
||||
|
||||
print('{macro} ({size}, {str_ref})'
|
||||
.format(macro=with_size_macro, size=size, str_ref=str_ref), file=gen_file)
|
||||
print(f'{with_size_macro} ({size}, {str_ref})', file=gen_file)
|
||||
|
||||
if () in guards:
|
||||
break
|
||||
@@ -286,7 +266,8 @@ def generate_first_magic_strings(gen_file, defs, with_size_macro):
|
||||
last_guards = guards
|
||||
|
||||
if () not in last_guards:
|
||||
print('#endif /* {guards} */'.format(guards=guards_to_str(last_guards)), file=gen_file)
|
||||
print(f'#endif /* {guards_to_str(last_guards)} */', file=gen_file)
|
||||
|
||||
|
||||
def generate_magic_strings(args, ini_path, item_name, pattern, inc_h_path, def_macro, with_size_macro=None):
|
||||
defs = read_magic_string_defs(args.debug, ini_path, item_name)
|
||||
@@ -294,12 +275,13 @@ def generate_magic_strings(args, ini_path, item_name, pattern, inc_h_path, def_m
|
||||
|
||||
extended_defs = calculate_magic_string_guards(defs, uses, debug=args.debug)
|
||||
|
||||
with open(inc_h_path, 'w') as gen_file:
|
||||
with open(inc_h_path, 'w', encoding='utf8') as gen_file:
|
||||
generate_header(gen_file, ini_path)
|
||||
generate_magic_string_defs(gen_file, extended_defs, def_macro)
|
||||
if with_size_macro:
|
||||
generate_first_magic_strings(gen_file, extended_defs, with_size_macro)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='lit-magic-strings.inc.h generator')
|
||||
parser.add_argument('--debug', action='store_true', help='enable debug output')
|
||||
@@ -329,5 +311,6 @@ def main():
|
||||
|
||||
subprocess.call([FORMAT_SCRIPT, '--fix'])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user