From 456cd513e360ccd17e51ae3711ec48976b1be0c0 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 3 May 2022 13:18:27 -0600 Subject: gh-81057: Get the c-analyzer tool working again. (gh-92246) --- Tools/c-analyzer/c_parser/info.py | 4 +++- Tools/c-analyzer/c_parser/parser/_compound_decl_body.py | 2 +- Tools/c-analyzer/c_parser/parser/_regexes.py | 7 +++++++ Tools/c-analyzer/cpython/_parser.py | 7 +++++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py index 697b1f2..bbfbff7 100644 --- a/Tools/c-analyzer/c_parser/info.py +++ b/Tools/c-analyzer/c_parser/info.py @@ -1161,7 +1161,9 @@ class Member(namedtuple('Member', 'name vartype size')): vartype = dict(raw.data) del vartype['storage'] if 'size' in vartype: - size = int(vartype.pop('size')) + size = vartype.pop('size') + if isinstance(size, str) and size.isdigit(): + size = int(size) vartype = VarType(**vartype) return cls(name, vartype, size) diff --git a/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py b/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py index eb5bc67..67528d2 100644 --- a/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py +++ b/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py @@ -99,7 +99,7 @@ def _parse_struct_next(m, srcinfo, anon_name, parent): name = anon_name('struct-field-') if size: # data = (data, size) - data['size'] = int(size) + data['size'] = int(size) if size.isdigit() else size else: # This shouldn't happen (we expect each field to have a name). raise NotImplementedError diff --git a/Tools/c-analyzer/c_parser/parser/_regexes.py b/Tools/c-analyzer/c_parser/parser/_regexes.py index cb85a59..b7f22b1 100644 --- a/Tools/c-analyzer/c_parser/parser/_regexes.py +++ b/Tools/c-analyzer/c_parser/parser/_regexes.py @@ -176,6 +176,7 @@ DECLARATOR = textwrap.dedent(rf''' (?: # {STRICT_IDENTIFIER} ) + # Inside the brackets is actually a "constant expression". (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays ) | @@ -184,6 +185,7 @@ DECLARATOR = textwrap.dedent(rf''' (?: # {STRICT_IDENTIFIER} ) + # Inside the brackets is actually a "constant expression". (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays \s* [)] ) @@ -194,6 +196,7 @@ DECLARATOR = textwrap.dedent(rf''' (?: # {STRICT_IDENTIFIER} ) + # Inside the brackets is actually a "constant expression". (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays \s* [)] # We allow for a single level of paren nesting in parameters. @@ -322,7 +325,10 @@ STRUCT_MEMBER_DECL = textwrap.dedent(rf''' (?: \s* [:] \s* (?: # + # This is actually a "constant expression". \d+ + | + [^'",}}]+ ) )? \s* @@ -357,6 +363,7 @@ ENUM_MEMBER_DECL = textwrap.dedent(rf''' (?: \s* = \s* (?: # + # This is actually a "constant expression". {_ind(STRING_LITERAL, 4)} | [^'",}}]+ diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 1900009..eaad727 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -46,6 +46,7 @@ def clean_lines(text): @end=sh@ ''' +# XXX Handle these. EXCLUDED = clean_lines(''' # @begin=conf@ @@ -69,6 +70,7 @@ Python/dynload_aix.c # sys/ldr.h Python/dynload_dl.c # dl.h Python/dynload_hpux.c # dl.h Python/thread_pthread.h +Python/emscripten_signal.c # only huge constants (safe but parsing is slow) Modules/_blake2/impl/blake2-kat.h @@ -202,6 +204,7 @@ Include/cpython/sysmodule.h Py_CPYTHON_SYSMODULE_H 1 Include/cpython/traceback.h Py_CPYTHON_TRACEBACK_H 1 Include/cpython/tupleobject.h Py_CPYTHON_TUPLEOBJECT_H 1 Include/cpython/unicodeobject.h Py_CPYTHON_UNICODEOBJECT_H 1 +Include/internal/pycore_code.h SIZEOF_VOID_P 8 # implied include of pyport.h Include/**/*.h PyAPI_DATA(RTYPE) extern RTYPE @@ -297,8 +300,8 @@ MAX_SIZES = { _abs('Objects/stringlib/unicode_format.h'): (10_000, 400), _abs('Objects/typeobject.c'): (20_000, 200), _abs('Python/compile.c'): (20_000, 500), - _abs('Python/pylifecycle.c'): (200_000, 5000), - _abs('Python/pystate.c'): (200_000, 5000), + _abs('Python/pylifecycle.c'): (500_000, 5000), + _abs('Python/pystate.c'): (500_000, 5000), } -- cgit v0.12