From b263efa94eee4a3afd0196c89223fff389d3b569 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Mon, 2 May 2022 14:29:15 -0600 Subject: [PATCH 1/5] Pre-set a macro for pycore_code.h. --- Tools/c-analyzer/cpython/_parser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 19000096fc9c3f..6a5b1531b2cbe3 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -202,6 +202,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 From c974a3e40a6fba5396cdf64e59ef6298b96c63ae Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 3 May 2022 11:38:05 -0600 Subject: [PATCH 2/5] Add a note about constant expressions. --- Tools/c-analyzer/c_parser/parser/_regexes.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tools/c-analyzer/c_parser/parser/_regexes.py b/Tools/c-analyzer/c_parser/parser/_regexes.py index cb85a59aaa16c2..5ad41c11b5f89e 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'): (?: # {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'): (?: # {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'): (?: # {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,6 +325,7 @@ def _ind(text, level=1, edges='both'): (?: \s* [:] \s* (?: # + # This is actually a "constant expression". \d+ ) )? @@ -357,6 +361,7 @@ def _ind(text, level=1, edges='both'): (?: \s* = \s* (?: # + # This is actually a "constant expression". {_ind(STRING_LITERAL, 4)} | [^'",}}]+ From e6a270012f6e753f86a0f582e3e3ca418291f79f Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 3 May 2022 11:48:24 -0600 Subject: [PATCH 3/5] Let the struct declarator size be a constant expression. --- 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 | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py index 697b1f26dc2151..bbfbff7e62d027 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 eb5bc67607bb19..67528d22798962 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 5ad41c11b5f89e..b7f22b186f4965 100644 --- a/Tools/c-analyzer/c_parser/parser/_regexes.py +++ b/Tools/c-analyzer/c_parser/parser/_regexes.py @@ -327,6 +327,8 @@ def _ind(text, level=1, edges='both'): (?: # # This is actually a "constant expression". \d+ + | + [^'",}}]+ ) )? \s* From c3aa1ea21d57904aa4bd57bf9f61bbc89a8c3ab5 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 3 May 2022 12:07:16 -0600 Subject: [PATCH 4/5] Ignore emscripten_signal.c for now. --- Tools/c-analyzer/cpython/_parser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 6a5b1531b2cbe3..d5f6cc6ae8f710 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 From 962cf84e1d9c9642798a696b17a6f13c4b259ddc Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 3 May 2022 12:07:53 -0600 Subject: [PATCH 5/5] Adjust for the size of _PyRuntimeState_INIT. --- Tools/c-analyzer/cpython/_parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index d5f6cc6ae8f710..eaad7278ed79e3 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -300,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), }