[Python-checkins] gh-81057: Get the c-analyzer tool working again. (gh-92246)
ericsnowcurrently
webhook-mailer at python.org
Tue May 3 15:18:39 EDT 2022
https://github.com/python/cpython/commit/456cd513e360ccd17e51ae3711ec48976b1be0c0
commit: 456cd513e360ccd17e51ae3711ec48976b1be0c0
branch: main
author: Eric Snow <ericsnowcurrently at gmail.com>
committer: ericsnowcurrently <ericsnowcurrently at gmail.com>
date: 2022-05-03T13:18:27-06:00
summary:
gh-81057: Get the c-analyzer tool working again. (gh-92246)
files:
M Tools/c-analyzer/c_parser/info.py
M Tools/c-analyzer/c_parser/parser/_compound_decl_body.py
M Tools/c-analyzer/c_parser/parser/_regexes.py
M Tools/c-analyzer/cpython/_parser.py
diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py
index 697b1f26dc215..bbfbff7e62d02 100644
--- a/Tools/c-analyzer/c_parser/info.py
+++ b/Tools/c-analyzer/c_parser/info.py
@@ -1161,7 +1161,9 @@ def from_data(cls, raw, index):
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 eb5bc67607bb1..67528d2279896 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_body(source):
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 cb85a59aaa16c..b7f22b186f496 100644
--- a/Tools/c-analyzer/c_parser/parser/_regexes.py
+++ b/Tools/c-analyzer/c_parser/parser/_regexes.py
@@ -176,6 +176,7 @@ def _ind(text, level=1, edges='both'):
(?: # <IDENTIFIER>
{STRICT_IDENTIFIER}
)
+ # Inside the brackets is actually a "constant expression".
(?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays
)
|
@@ -184,6 +185,7 @@ def _ind(text, level=1, edges='both'):
(?: # <WRAPPED_IDENTIFIER>
{STRICT_IDENTIFIER}
)
+ # Inside the brackets is actually a "constant expression".
(?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays
\s* [)]
)
@@ -194,6 +196,7 @@ def _ind(text, level=1, edges='both'):
(?: # <FUNC_IDENTIFIER>
{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 @@ def _ind(text, level=1, edges='both'):
(?:
\s* [:] \s*
(?: # <SIZE>
+ # This is actually a "constant expression".
\d+
+ |
+ [^'",}}]+
)
)?
\s*
@@ -357,6 +363,7 @@ def _ind(text, level=1, edges='both'):
(?:
\s* = \s*
(?: # <INIT>
+ # 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 19000096fc9c3..eaad7278ed79e 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 @@ def clean_lines(text):
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 @@ def clean_lines(text):
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 @@ def clean_lines(text):
_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),
}
More information about the Python-checkins
mailing list