[Python-checkins] gh-90110: Clean Up the C-analyzer Globals Lists (gh-100091)

ericsnowcurrently webhook-mailer at python.org
Wed Dec 7 17:02:58 EST 2022


https://github.com/python/cpython/commit/d47ffeb9e35dbc7264ffa12fddaa6e0d3ba767a4
commit: d47ffeb9e35dbc7264ffa12fddaa6e0d3ba767a4
branch: main
author: Eric Snow <ericsnowcurrently at gmail.com>
committer: ericsnowcurrently <ericsnowcurrently at gmail.com>
date: 2022-12-07T15:02:47-07:00
summary:

gh-90110: Clean Up the C-analyzer Globals Lists (gh-100091)

https://github.com/python/cpython/issues/90110

files:
M Parser/action_helpers.c
M Tools/c-analyzer/cpython/globals-to-fix.tsv
M Tools/c-analyzer/cpython/ignored.tsv
M Tools/c-analyzer/table-file.py

diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c
index 27c093332f67..f12dad095aca 100644
--- a/Parser/action_helpers.c
+++ b/Parser/action_helpers.c
@@ -13,6 +13,7 @@ void *
 _PyPegen_dummy_name(Parser *p, ...)
 {
     // XXX This leaks memory from the initial arena.
+    // Use a statically allocated variable instead of a pointer?
     static void *cache = NULL;
 
     if (cache != NULL) {
@@ -1287,4 +1288,4 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq
         _PyPegen_get_last_comprehension_item(last_comprehension),
         "Generator expression must be parenthesized"
     );
-}
\ No newline at end of file
+}
diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv
index adbb319a1b6f..af5b7eb8eaf0 100644
--- a/Tools/c-analyzer/cpython/globals-to-fix.tsv
+++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv
@@ -4,10 +4,10 @@ filename	funcname	name	reason
 # These are all variables that we will be making non-global.
 
 ##################################
-# global objects to fix in core code
+## global objects to fix in core code
 
-#-----------------------
-# exported builtin types (C-API)
+##-----------------------
+## exported builtin types (C-API)
 
 Objects/boolobject.c	-	PyBool_Type	-
 Objects/bytearrayobject.c	-	PyByteArrayIter_Type	-
@@ -102,8 +102,8 @@ Python/context.c	-	PyContextVar_Type	-
 Python/context.c	-	PyContext_Type	-
 Python/traceback.c	-	PyTraceBack_Type	-
 
-#-----------------------
-# other exported builtin types
+##-----------------------
+## other exported builtin types
 
 # Not in a .h file:
 Objects/codeobject.c	-	_PyLineIterator	-
@@ -126,8 +126,8 @@ Python/hamt.c	-	_PyHamt_CollisionNode_Type	-
 Python/hamt.c	-	_PyHamt_Type	-
 Python/symtable.c	-	PySTEntry_Type	-
 
-#-----------------------
-# private static builtin types
+##-----------------------
+## private static builtin types
 
 Objects/setobject.c	-	_PySetDummy_Type	-
 Objects/stringlib/unicode_format.h	-	PyFormatterIter_Type	-
@@ -136,8 +136,8 @@ Objects/unicodeobject.c	-	EncodingMapType	-
 #Objects/unicodeobject.c	-	PyFieldNameIter_Type	-
 #Objects/unicodeobject.c	-	PyFormatterIter_Type	-
 
-#-----------------------
-# static builtin structseq
+##-----------------------
+## static builtin structseq
 
 Objects/floatobject.c	-	FloatInfoType	-
 Objects/longobject.c	-	Int_InfoType	-
@@ -148,8 +148,8 @@ Python/sysmodule.c	-	Hash_InfoType	-
 Python/sysmodule.c	-	VersionInfoType	-
 Python/thread.c	-	ThreadInfoType	-
 
-#-----------------------
-# builtin exception types
+##-----------------------
+## builtin exception types
 
 Objects/exceptions.c	-	_PyExc_BaseException	-
 Objects/exceptions.c	-	_PyExc_BaseExceptionGroup	-
@@ -286,8 +286,8 @@ Objects/exceptions.c	-	PyExc_BytesWarning	-
 Objects/exceptions.c	-	PyExc_ResourceWarning	-
 Objects/exceptions.c	-	PyExc_EncodingWarning	-
 
-#-----------------------
-# singletons
+##-----------------------
+## singletons
 
 Objects/boolobject.c	-	_Py_FalseStruct	-
 Objects/boolobject.c	-	_Py_TrueStruct	-
@@ -300,26 +300,26 @@ Objects/sliceobject.c	-	_Py_EllipsisObject	-
 
 
 ##################################
-# global non-objects to fix in core code
+## global non-objects to fix in core code
 
-#-----------------------
-# effectively-const but initialized lazily
+##-----------------------
+## effectively-const but initialized lazily
 
-# idempotent
+## idempotent
 Python/dtoa.c	-	p5s	-
 Objects/obmalloc.c	new_arena	debug_stats	-
 
-# others
+## others
 Python/perf_trampoline.c	-	perf_map_file	-
 Objects/unicodeobject.c	-	ucnhash_capi	-
 
-#-----------------------
-# state
+##-----------------------
+## state
 
-# local buffer
+## local buffer
 Python/suggestions.c	levenshtein_distance	buffer	-
 
-# other
+## other
 Objects/object.c	-	_Py_RefTotal	-
 Python/perf_trampoline.c	-	perf_status	-
 Python/perf_trampoline.c	-	extra_code_index	-
@@ -329,10 +329,10 @@ Python/thread_pthread_stubs.h	-	py_tls_entries	-
 
 
 ##################################
-# global objects to fix in builtin modules
+## global objects to fix in builtin modules
 
-#-----------------------
-# static types
+##-----------------------
+## static types
 
 Modules/_collectionsmodule.c	-	defdict_type	-
 Modules/_collectionsmodule.c	-	deque_type	-
@@ -381,10 +381,10 @@ Modules/itertoolsmodule.c	-	tee_type	-
 Modules/itertoolsmodule.c	-	teedataobject_type	-
 Modules/itertoolsmodule.c	-	ziplongest_type	-
 
-#-----------------------
-# other
+##-----------------------
+## other
 
-# state
+## state
 Modules/faulthandler.c	-	fatal_error	-
 Modules/faulthandler.c	-	thread	-
 Modules/faulthandler.c	-	user_signals	-
@@ -393,10 +393,10 @@ Modules/faulthandler.c	-	old_stack	-
 
 
 ##################################
-# global non-objects to fix in builtin modules
+## global non-objects to fix in builtin modules
 
-#-----------------------
-# initialized once
+##-----------------------
+## initialized once
 
 Modules/_io/bufferedio.c	_PyIO_trap_eintr	eintr_int	-
 Modules/posixmodule.c	os_dup2_impl	dup3_works	-
@@ -405,8 +405,8 @@ Modules/posixmodule.c	-	ticks_per_second	-
 Modules/timemodule.c	_PyTime_GetClockWithInfo	initialized	-
 Modules/timemodule.c	_PyTime_GetProcessTimeWithInfo	ticks_per_second	-
 
-#-----------------------
-# state
+##-----------------------
+## state
 
 Modules/_tracemalloc.c	-	allocators	-
 Modules/_tracemalloc.c	-	tables_lock	-
@@ -420,7 +420,6 @@ Modules/_tracemalloc.c	-	tracemalloc_traces	-
 Modules/_tracemalloc.c	-	tracemalloc_domains	-
 Modules/_tracemalloc.c	-	tracemalloc_reentrant_key	-
 Modules/faulthandler.c	faulthandler_dump_traceback	reentrant	-
-Modules/posixmodule.c	-	environ	-
 Modules/signalmodule.c	-	is_tripped	-
 Modules/signalmodule.c	-	signal_global_state	-
 Modules/signalmodule.c	-	wakeup	-
@@ -428,10 +427,10 @@ Modules/signalmodule.c	-	Handlers	-
 
 
 ##################################
-# global objects to fix in extension modules
+## global objects to fix in extension modules
 
-#-----------------------
-# static types
+##-----------------------
+## static types
 
 Modules/_asynciomodule.c	-	FutureIterType	-
 Modules/_asynciomodule.c	-	FutureType	-
@@ -506,10 +505,10 @@ Modules/xxmodule.c	-	Xxo_Type	-
 Modules/xxsubtype.c	-	spamdict_type	-
 Modules/xxsubtype.c	-	spamlist_type	-
 
-#-----------------------
-# non-static types - initialized once
+##-----------------------
+## non-static types - initialized once
 
-# heap types
+## heap types
 Modules/_decimal/_decimal.c	-	DecimalTuple	-
 Modules/_decimal/_decimal.c	-	PyDecSignalDict_Type	-
 Modules/_tkinter.c	-	PyTclObject_Type	-
@@ -517,7 +516,7 @@ Modules/_tkinter.c	-	Tkapp_Type	-
 Modules/_tkinter.c	-	Tktt_Type	-
 Modules/xxlimited_35.c	-	Xxo_Type	-
 
-# exception types
+## exception types
 Modules/_ctypes/_ctypes.c	-	PyExc_ArgError	-
 Modules/_cursesmodule.c	-	PyCursesError	-
 Modules/_decimal/_decimal.c	-	DecimalException	-
@@ -528,15 +527,15 @@ Modules/socketmodule.c	-	socket_gaierror	-
 Modules/xxlimited_35.c	-	ErrorObject	-
 Modules/xxmodule.c	-	ErrorObject	-
 
-#-----------------------
-# cached - initialized once
+##-----------------------
+## cached - initialized once
 
-# manually cached PyUnicodeOjbect
+## manually cached PyUnicodeOjbect
 Modules/_asynciomodule.c	-	context_kwname	-
 Modules/_ctypes/callproc.c	_ctypes_get_errobj	error_object_name	-
 Modules/_ctypes/_ctypes.c	CreateSwappedType	suffix	-
 
-# other - during module init
+## other - during module init
 Modules/_asynciomodule.c	-	asyncio_mod	-
 Modules/_asynciomodule.c	-	traceback_extract_stack	-
 Modules/_asynciomodule.c	-	asyncio_future_repr_func	-
@@ -551,10 +550,10 @@ Modules/_zoneinfo.c	-	io_open	-
 Modules/_zoneinfo.c	-	_tzpath_find_tzfile	-
 Modules/_zoneinfo.c	-	_common_mod	-
 
-#-----------------------
-# other
+##-----------------------
+## other
 
-# initialized once
+## initialized once
 Modules/_ctypes/_ctypes.c	-	_unpickle	-
 Modules/_ctypes/_ctypes.c	PyCArrayType_from_ctype	cache	-
 Modules/_cursesmodule.c	-	ModDict	-
@@ -577,7 +576,7 @@ Modules/_decimal/_decimal.c	-	Rational	-
 Modules/_decimal/_decimal.c	-	SignalTuple	-
 Modules/arraymodule.c	array_array___reduce_ex___impl	array_reconstructor	-
 
-# state
+## state
 Modules/_asynciomodule.c	-	cached_running_holder	-
 Modules/_asynciomodule.c	-	fi_freelist	-
 Modules/_asynciomodule.c	-	fi_freelist_len	-
@@ -592,20 +591,19 @@ Modules/_tkinter.c	-	valInCmd	-
 Modules/_tkinter.c	-	trbInCmd	-
 Modules/_zoneinfo.c	-	TIMEDELTA_CACHE	-
 Modules/_zoneinfo.c	-	ZONEINFO_WEAK_CACHE	-
-Modules/syslogmodule.c	-	S_ident_o	-
 
 
 ##################################
-# global non-objects to fix in extension modules
+## global non-objects to fix in extension modules
 
-#-----------------------
-# initialized once
+##-----------------------
+## initialized once
 
-# pre-allocated buffer
+## pre-allocated buffer
 Modules/nismodule.c	nisproc_maplist_2	res	-
 Modules/pyexpat.c	PyUnknownEncodingHandler	template_buffer	-
 
-# other
+## other
 Include/datetime.h	-	PyDateTimeAPI	-
 Modules/_asynciomodule.c	-	module_initialized	-
 Modules/_ctypes/cfield.c	_ctypes_get_fielddesc	initialized	-
@@ -650,8 +648,8 @@ Modules/readline.c	-	libedit_history_start	-
 Modules/socketmodule.c	-	accept4_works	-
 Modules/socketmodule.c	-	sock_cloexec_works	-
 
-#-----------------------
-# state
+##-----------------------
+## state
 
 Modules/_asynciomodule.c	-	cached_running_holder_tsid	-
 Modules/_asynciomodule.c	-	task_name_counter	-
@@ -681,4 +679,3 @@ Modules/readline.c	-	completed_input_string	-
 Modules/rotatingtree.c	-	random_stream	-
 Modules/rotatingtree.c	-	random_value	-
 Modules/socketmodule.c	-	defaulttimeout	-
-Modules/syslogmodule.c	-	S_log_open	-
diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv
index 242deace8c94..128336a997eb 100644
--- a/Tools/c-analyzer/cpython/ignored.tsv
+++ b/Tools/c-analyzer/cpython/ignored.tsv
@@ -5,52 +5,61 @@ filename	funcname	name	reason
 
 
 ##################################
-# process-global resources
+## process-global values - set once
 
-# Initialization for these should be idempotent.
+# These will never re-initialize (but would be idempotent).
+# These are effectively const.
 
-#-----------------------
-# effectively const, set once before/during first init
+##-----------------------
+## process-global resources - set during first init
 
-Modules/getbuildinfo.c	-	buildinfo	-
-Modules/getbuildinfo.c	-	initialized	-
-Python/getversion.c	-	initialized	-
-Python/getversion.c	-	version	-
-
-#-----------------------
-# effectively const, set once during first init
+## indicators for resource availability/capability
+Python/bootstrap_hash.c	py_getrandom	getrandom_works	-
+Python/fileutils.c	-	_Py_open_cloexec_works	-
+Python/fileutils.c	set_inheritable	ioctl_works	-
 
-Python/bootstrap_hash.c	-	_Py_HashSecret_Initialized	-
-Python/pyhash.c	-	_Py_HashSecret	-
+## resource init
 Python/thread.c	-	initialized	-
 Python/thread_pthread.h	-	condattr_monotonic	-
-
 # safe static buffer used during one-time initialization
 Python/thread_pthread.h	init_condattr	ca	-
 
-# indicators for process-global resource availability/capability
-Python/bootstrap_hash.c	py_getrandom	getrandom_works	-
-Python/fileutils.c	-	_Py_open_cloexec_works	-
-Python/fileutils.c	set_inheritable	ioctl_works	-
-
-#-----------------------
-# effectively const but set once lazily (*after* first init)
+##-----------------------
+## other values (not Python-specific)
 
+## cached computed data - set lazily (*after* first init)
+# XXX Are these safe relative to write races?
 Objects/longobject.c	long_from_non_binary_base	log_base_BASE	-
 Objects/longobject.c	long_from_non_binary_base	convwidth_base	-
 Objects/longobject.c	long_from_non_binary_base	convmultmax_base	-
 Objects/unicodeobject.c	-	bloom_linebreak	-
+# This is safe:
 Objects/unicodeobject.c	_init_global_state	initialized	-
 
-# XXX Move to _PyRuntimeState?
+##-----------------------
+## other values (Python-specific)
+
+## internal state - set before/during first init
+Modules/getbuildinfo.c	-	buildinfo	-
+Modules/getbuildinfo.c	-	initialized	-
+Python/getversion.c	-	initialized	-
+Python/getversion.c	-	version	-
+
+## public C-API - set during first init
+Python/bootstrap_hash.c	-	_Py_HashSecret_Initialized	-
+Python/pyhash.c	-	_Py_HashSecret	-
+
+## internal state - set lazily (*after* first init)
+# XXX Move to _PyRuntimeState (i.e. tie to init/fini cycle)?
 Parser/action_helpers.c	_PyPegen_dummy_name	cache	-
 
 
 ##################################
-# state tied to C main() (only in main thread)
+## state tied to Py_Main()
+# (only in main thread)
 
-#-----------------------
-# handling C argv
+##-----------------------
+## handling C argv
 
 Python/getopt.c	-	_PyOS_optarg	-
 Python/getopt.c	-	_PyOS_opterr	-
@@ -58,8 +67,8 @@ Python/getopt.c	-	_PyOS_optind	-
 Python/getopt.c	-	opt_ptr	-
 Python/pathconfig.c	-	_Py_path_config	-
 
-#-----------------------
-# REPL
+##-----------------------
+## REPL
 
 Parser/myreadline.c	-	_PyOS_ReadlineLock	-
 Parser/myreadline.c	-	_PyOS_ReadlineTState	-
@@ -68,28 +77,29 @@ Parser/myreadline.c	-	PyOS_ReadlineFunctionPointer	-
 
 
 ##################################
-# state tied to each runtime init/fini cycle
+## runtime-global values - set once with each init
 
-Python/pylifecycle.c	-	_PyRuntime	-
-Python/pylifecycle.c	-	runtime_initialized	-
+# These are effectively const.
 
-# All uses of _PyArg_Parser are handled in c-analyzr/cpython/_analyzer.py.
+##-----------------------
+## set by embedders before init
+# (whether directly or through a call)
 
-#-----------------------
-# effectively const once init finishes
-
-# set by embedders before init (whether directly or through a call)
 Python/initconfig.c	-	_Py_StandardStreamEncoding	-
 Python/initconfig.c	-	_Py_StandardStreamErrors	-
+# XXX This only gets cleared by Py_Main().
 Python/initconfig.c	-	orig_argv	-
 
-# deprecated
+##-----------------------
+## public C-API
+
+## deprecated
 Python/preconfig.c	-	Py_FileSystemDefaultEncoding	-
 Python/preconfig.c	-	Py_HasFileSystemDefaultEncoding	-
 Python/preconfig.c	-	Py_FileSystemDefaultEncodeErrors	-
 Python/preconfig.c	-	_Py_HasFileSystemDefaultEncodeErrors	-
 
-# legacy config flags
+## legacy config flags
 Python/initconfig.c	-	Py_UTF8Mode	-
 Python/initconfig.c	-	Py_DebugFlag	-
 Python/initconfig.c	-	Py_VerboseFlag	-
@@ -109,373 +119,70 @@ Python/initconfig.c	-	Py_IsolatedFlag	-
 Python/initconfig.c	-	Py_LegacyWindowsFSEncodingFlag	-
 Python/initconfig.c	-	Py_LegacyWindowsStdioFlag	-
 
-# initialized statically, customized by embedders
+##-----------------------
+## initialized statically, may be customized by embedders
+
 Python/frozen.c	-	PyImport_FrozenModules	-
 Python/import.c	-	inittab_copy	-
 Python/import.c	-	PyImport_Inittab	-
 
-# used temporarily during init
-Python/sysmodule.c	-	_preinit_warnoptions	-
-Python/sysmodule.c	-	_preinit_xoptions	-
-
 
 ##################################
-# special-use diagnistic state
+## runtime-global state
 
-Parser/pegen.c	-	memo_statistics	-
+##-----------------------
+## tied to each init/fini cycle
 
+## the consolidated runtime state
+Python/pylifecycle.c	-	_PyRuntime	-
+Python/pylifecycle.c	-	runtime_initialized	-
 
-##################################
-# one-off temporary state
+# All cases of _PyArg_Parser are handled in c-analyzr/cpython/_analyzer.py.
 
-# This is safe enough.
-Python/pylifecycle.c	_Py_FatalErrorFormat	reentrant	-
-Python/pylifecycle.c	fatal_error	reentrant	-
+## main interp state in stdlib modules
+Modules/syslogmodule.c	-	S_ident_o	-
+Modules/syslogmodule.c	-	S_log_open	-
 
+##-----------------------
+## *not* tied to init/fini cycle
 
-##################################
-# not used (kept for compatibility)
+# These do not ge reset with each init/fini cycle.
+# XXX These should probably be tied to init/fini.  Move to _PyRuntimeState?
 
-Python/pyfpe.c	-	PyFPE_counter	-
+# special-use diagnistic state
+Parser/pegen.c	-	memo_statistics	-
+
+##-----------------------
+## one-off temporary state
+
+# used during runtime init
+Python/sysmodule.c	-	_preinit_warnoptions	-
+Python/sysmodule.c	-	_preinit_xoptions	-
+
+# thread-safety
+# XXX need race protection?
+Python/pylifecycle.c	_Py_FatalErrorFormat	reentrant	-
+Python/pylifecycle.c	fatal_error	reentrant	-
 
 
 ##################################
-# The analyzer should have ignored these.
-# XXX Fix the analyzer.
+## not significant
 
-Modules/_io/_iomodule.c	-	_PyIO_Module	-
-Modules/_sqlite/module.c	-	_sqlite3module	-
+##-----------------------
+## not used (kept for compatibility)
 
-# forward/extern references
+Python/pyfpe.c	-	PyFPE_counter	-
 
-Include/py_curses.h	-	PyCurses_API	-
-Include/pydecimal.h	-	_decimal_api	-
-Modules/_blake2/blake2module.c	-	blake2b_type_spec	-
-Modules/_blake2/blake2module.c	-	blake2s_type_spec	-
-Modules/_io/fileio.c	-	_Py_open_cloexec_works	-
-Modules/_io/_iomodule.h	-	PyIOBase_Type	-
-Modules/_io/_iomodule.h	-	PyRawIOBase_Type	-
-Modules/_io/_iomodule.h	-	PyBufferedIOBase_Type	-
-Modules/_io/_iomodule.h	-	PyTextIOBase_Type	-
-Modules/_io/_iomodule.h	-	PyFileIO_Type	-
-Modules/_io/_iomodule.h	-	PyBytesIO_Type	-
-Modules/_io/_iomodule.h	-	PyStringIO_Type	-
-Modules/_io/_iomodule.h	-	PyBufferedReader_Type	-
-Modules/_io/_iomodule.h	-	PyBufferedWriter_Type	-
-Modules/_io/_iomodule.h	-	PyBufferedRWPair_Type	-
-Modules/_io/_iomodule.h	-	PyBufferedRandom_Type	-
-Modules/_io/_iomodule.h	-	PyTextIOWrapper_Type	-
-Modules/_io/_iomodule.h	-	PyIncrementalNewlineDecoder_Type	-
-Modules/_io/_iomodule.h	-	_PyBytesIOBuffer_Type	-
-Modules/_io/_iomodule.h	-	_PyIO_Module	-
-Modules/_io/_iomodule.h	-	_PyIO_str_close	-
-Modules/_io/_iomodule.h	-	_PyIO_str_closed	-
-Modules/_io/_iomodule.h	-	_PyIO_str_decode	-
-Modules/_io/_iomodule.h	-	_PyIO_str_encode	-
-Modules/_io/_iomodule.h	-	_PyIO_str_fileno	-
-Modules/_io/_iomodule.h	-	_PyIO_str_flush	-
-Modules/_io/_iomodule.h	-	_PyIO_str_getstate	-
-Modules/_io/_iomodule.h	-	_PyIO_str_isatty	-
-Modules/_io/_iomodule.h	-	_PyIO_str_newlines	-
-Modules/_io/_iomodule.h	-	_PyIO_str_nl	-
-Modules/_io/_iomodule.h	-	_PyIO_str_peek	-
-Modules/_io/_iomodule.h	-	_PyIO_str_read	-
-Modules/_io/_iomodule.h	-	_PyIO_str_read1	-
-Modules/_io/_iomodule.h	-	_PyIO_str_readable	-
-Modules/_io/_iomodule.h	-	_PyIO_str_readall	-
-Modules/_io/_iomodule.h	-	_PyIO_str_readinto	-
-Modules/_io/_iomodule.h	-	_PyIO_str_readline	-
-Modules/_io/_iomodule.h	-	_PyIO_str_reset	-
-Modules/_io/_iomodule.h	-	_PyIO_str_seek	-
-Modules/_io/_iomodule.h	-	_PyIO_str_seekable	-
-Modules/_io/_iomodule.h	-	_PyIO_str_setstate	-
-Modules/_io/_iomodule.h	-	_PyIO_str_tell	-
-Modules/_io/_iomodule.h	-	_PyIO_str_truncate	-
-Modules/_io/_iomodule.h	-	_PyIO_str_writable	-
-Modules/_io/_iomodule.h	-	_PyIO_str_write	-
-Modules/_io/_iomodule.h	-	_PyIO_empty_str	-
-Modules/_io/_iomodule.h	-	_PyIO_empty_bytes	-
-Modules/_multiprocessing/multiprocessing.h	-	_PyMp_SemLockType	-
-Modules/_sqlite/module.c	-	_pysqlite_converters	-
-Modules/_sqlite/module.c	-	_pysqlite_enable_callback_tracebacks	-
-Modules/_sqlite/module.c	-	pysqlite_BaseTypeAdapted	-
-Modules/_sqlite/module.h	-	pysqlite_global_state	-
-Modules/_testcapimodule.c	-	_PyBytesIOBuffer_Type	-
-Modules/posixmodule.c	-	_Py_open_cloexec_works	-
-Objects/object.c	-	_Py_GenericAliasIterType	-
-Objects/object.c	-	_PyMemoryIter_Type	-
-Objects/object.c	-	_PyLineIterator	-
-Objects/object.c	-	_PyPositionsIterator	-
-Python/perf_trampoline.c	-	_Py_trampoline_func_start	-
-Python/perf_trampoline.c	-	_Py_trampoline_func_end	-
-Python/importdl.h	-	_PyImport_DynLoadFiletab	-
+##-----------------------
+## should be const
+# XXX Make them const.
 
-Modules/expat/xmlrole.c	-	prolog0	-
-Modules/expat/xmlrole.c	-	prolog1	-
-Modules/expat/xmlrole.c	-	prolog2	-
-Modules/expat/xmlrole.c	-	doctype0	-
-Modules/expat/xmlrole.c	-	doctype1	-
-Modules/expat/xmlrole.c	-	doctype2	-
-Modules/expat/xmlrole.c	-	doctype3	-
-Modules/expat/xmlrole.c	-	doctype4	-
-Modules/expat/xmlrole.c	-	doctype5	-
-Modules/expat/xmlrole.c	-	internalSubset	-
-Modules/expat/xmlrole.c	-	entity0	-
-Modules/expat/xmlrole.c	-	entity1	-
-Modules/expat/xmlrole.c	-	entity2	-
-Modules/expat/xmlrole.c	-	entity3	-
-Modules/expat/xmlrole.c	-	entity4	-
-Modules/expat/xmlrole.c	-	entity5	-
-Modules/expat/xmlrole.c	-	entity6	-
-Modules/expat/xmlrole.c	-	entity7	-
-Modules/expat/xmlrole.c	-	entity8	-
-Modules/expat/xmlrole.c	-	entity9	-
-Modules/expat/xmlrole.c	-	entity10	-
-Modules/expat/xmlrole.c	-	notation0	-
-Modules/expat/xmlrole.c	-	notation1	-
-Modules/expat/xmlrole.c	-	notation2	-
-Modules/expat/xmlrole.c	-	notation3	-
-Modules/expat/xmlrole.c	-	notation4	-
-Modules/expat/xmlrole.c	-	attlist0	-
-Modules/expat/xmlrole.c	-	attlist1	-
-Modules/expat/xmlrole.c	-	attlist2	-
-Modules/expat/xmlrole.c	-	attlist3	-
-Modules/expat/xmlrole.c	-	attlist4	-
-Modules/expat/xmlrole.c	-	attlist5	-
-Modules/expat/xmlrole.c	-	attlist6	-
-Modules/expat/xmlrole.c	-	attlist7	-
-Modules/expat/xmlrole.c	-	attlist8	-
-Modules/expat/xmlrole.c	-	attlist9	-
-Modules/expat/xmlrole.c	-	element0	-
-Modules/expat/xmlrole.c	-	element1	-
-Modules/expat/xmlrole.c	-	element2	-
-Modules/expat/xmlrole.c	-	element3	-
-Modules/expat/xmlrole.c	-	element4	-
-Modules/expat/xmlrole.c	-	element5	-
-Modules/expat/xmlrole.c	-	element6	-
-Modules/expat/xmlrole.c	-	element7	-
-Modules/expat/xmlrole.c	-	externalSubset0	-
-Modules/expat/xmlrole.c	-	externalSubset1	-
-Modules/expat/xmlrole.c	-	condSect0	-
-Modules/expat/xmlrole.c	-	condSect1	-
-Modules/expat/xmlrole.c	-	condSect2	-
-Modules/expat/xmlrole.c	-	declClose	-
-Modules/expat/xmlrole.c	-	error	-
+# These are all variables that we will be leaving global.
 
+# All module defs, type defs, etc. are handled in c-analyzr/cpython/_analyzer.py.
+# All kwlist arrays are handled in c-analyzr/cpython/_analyzer.py.
 
-##################################
-# test code
-
-Modules/_ctypes/_ctypes_test.c	-	_ctypes_test_slots	-
-Modules/_ctypes/_ctypes_test.c	-	_ctypes_testmodule	-
-Modules/_ctypes/_ctypes_test.c	-	_xxx_lib	-
-Modules/_ctypes/_ctypes_test.c	-	an_integer	-
-Modules/_ctypes/_ctypes_test.c	-	bottom	-
-Modules/_ctypes/_ctypes_test.c	-	last_tf_arg_s	-
-Modules/_ctypes/_ctypes_test.c	-	last_tf_arg_u	-
-Modules/_ctypes/_ctypes_test.c	-	last_tfrsuv_arg	-
-Modules/_ctypes/_ctypes_test.c	-	left	-
-Modules/_ctypes/_ctypes_test.c	-	module_methods	-
-Modules/_ctypes/_ctypes_test.c	-	my_eggs	-
-Modules/_ctypes/_ctypes_test.c	-	my_spams	-
-Modules/_ctypes/_ctypes_test.c	-	right	-
-Modules/_ctypes/_ctypes_test.c	-	top	-
-Modules/_testbuffer.c	-	NDArray_Type	-
-Modules/_testbuffer.c	-	StaticArray_Type	-
-Modules/_testbuffer.c	-	Struct	-
-Modules/_testbuffer.c	-	_testbuffer_functions	-
-Modules/_testbuffer.c	-	_testbuffermodule	-
-Modules/_testbuffer.c	-	calcsize	-
-Modules/_testbuffer.c	-	infobuf	-
-Modules/_testbuffer.c	-	ndarray_as_buffer	-
-Modules/_testbuffer.c	-	ndarray_as_mapping	-
-Modules/_testbuffer.c	-	ndarray_as_sequence	-
-Modules/_testbuffer.c	-	ndarray_getset	-
-Modules/_testbuffer.c	-	ndarray_methods	-
-Modules/_testbuffer.c	-	simple_fmt	-
-Modules/_testbuffer.c	-	simple_format	-
-Modules/_testbuffer.c	-	static_buffer	-
-Modules/_testbuffer.c	-	static_mem	-
-Modules/_testbuffer.c	-	static_shape	-
-Modules/_testbuffer.c	-	static_strides	-
-Modules/_testbuffer.c	-	staticarray_as_buffer	-
-Modules/_testbuffer.c	-	structmodule	-
-Modules/_testbuffer.c	ndarray_init	kwlist	-
-Modules/_testbuffer.c	ndarray_memoryview_from_buffer	format	-
-Modules/_testbuffer.c	ndarray_memoryview_from_buffer	info	-
-Modules/_testbuffer.c	ndarray_memoryview_from_buffer	shape	-
-Modules/_testbuffer.c	ndarray_memoryview_from_buffer	strides	-
-Modules/_testbuffer.c	ndarray_memoryview_from_buffer	suboffsets	-
-Modules/_testbuffer.c	ndarray_push	kwlist	-
-Modules/_testbuffer.c	staticarray_init	kwlist	-
-Modules/_testcapi/heaptype.c	-	_testcapimodule	-
-Modules/_testcapi/unicode.c	-	_testcapimodule	-
-Modules/_testcapimodule.c	-	ContainerNoGC_members	-
-Modules/_testcapimodule.c	-	ContainerNoGC_type	-
-Modules/_testcapimodule.c	-	FmData	-
-Modules/_testcapimodule.c	-	FmHook	-
-Modules/_testcapimodule.c	-	GenericAlias_Type	-
-Modules/_testcapimodule.c	-	Generic_Type	-
-Modules/_testcapimodule.c	-	HeapCTypeSetattr_slots	-
-Modules/_testcapimodule.c	-	HeapCTypeSetattr_spec	-
-Modules/_testcapimodule.c	-	HeapCTypeSubclassWithFinalizer_slots	-
-Modules/_testcapimodule.c	-	HeapCTypeSubclassWithFinalizer_spec	-
-Modules/_testcapimodule.c	-	HeapCTypeSubclass_slots	-
-Modules/_testcapimodule.c	-	HeapCTypeSubclass_spec	-
-Modules/_testcapimodule.c	-	HeapCTypeWithBuffer_slots	-
-Modules/_testcapimodule.c	-	HeapCTypeWithBuffer_spec	-
-Modules/_testcapimodule.c	-	HeapCTypeWithDict_slots	-
-Modules/_testcapimodule.c	-	HeapCTypeWithDict_spec	-
-Modules/_testcapimodule.c	-	HeapCTypeWithNegativeDict_slots	-
-Modules/_testcapimodule.c	-	HeapCTypeWithNegativeDict_spec	-
-Modules/_testcapimodule.c	-	HeapCTypeWithWeakref_slots	-
-Modules/_testcapimodule.c	-	HeapCTypeWithWeakref_spec	-
-Modules/_testcapimodule.c	-	HeapCType_slots	-
-Modules/_testcapimodule.c	-	HeapCType_spec	-
-Modules/_testcapimodule.c	-	HeapDocCType_slots	-
-Modules/_testcapimodule.c	-	HeapDocCType_spec	-
-Modules/_testcapimodule.c	-	HeapGcCType_slots	-
-Modules/_testcapimodule.c	-	HeapGcCType_spec	-
-Modules/_testcapimodule.c	-	MethClass_Type	-
-Modules/_testcapimodule.c	-	MethInstance_Type	-
-Modules/_testcapimodule.c	-	MethStatic_Type	-
-Modules/_testcapimodule.c	-	MethodDescriptor2_Type	-
-Modules/_testcapimodule.c	-	MethodDescriptorBase_Type	-
-Modules/_testcapimodule.c	-	MethodDescriptorDerived_Type	-
-Modules/_testcapimodule.c	-	MethodDescriptorNopGet_Type	-
-Modules/_testcapimodule.c	-	MyList_Type	-
-Modules/_testcapimodule.c	-	PyRecursingInfinitelyError_Type	-
-Modules/_testcapimodule.c	-	TestError	-
-Modules/_testcapimodule.c	-	TestMethods	-
-Modules/_testcapimodule.c	-	_HashInheritanceTester_Type	-
-Modules/_testcapimodule.c	-	_testcapimodule	-
-Modules/_testcapimodule.c	-	awaitType	-
-Modules/_testcapimodule.c	-	awaitType_as_async	-
-Modules/_testcapimodule.c	-	capsule_context	-
-Modules/_testcapimodule.c	-	capsule_destructor_call_count	-
-Modules/_testcapimodule.c	-	capsule_error	-
-Modules/_testcapimodule.c	-	capsule_name	-
-Modules/_testcapimodule.c	-	capsule_pointer	-
-Modules/_testcapimodule.c	-	decimal_initialized	-
-Modules/_testcapimodule.c	-	generic_alias_methods	-
-Modules/_testcapimodule.c	-	generic_methods	-
-Modules/_testcapimodule.c	-	heapctype_members	-
-Modules/_testcapimodule.c	-	heapctypesetattr_members	-
-Modules/_testcapimodule.c	-	heapctypesubclass_members	-
-Modules/_testcapimodule.c	-	heapctypewithdict_getsetlist	-
-Modules/_testcapimodule.c	-	heapctypewithdict_members	-
-Modules/_testcapimodule.c	-	heapctypewithnegativedict_members	-
-Modules/_testcapimodule.c	-	heapctypewithweakref_members	-
-Modules/_testcapimodule.c	-	ipowType	-
-Modules/_testcapimodule.c	-	ipowType_as_number	-
-Modules/_testcapimodule.c	-	matmulType	-
-Modules/_testcapimodule.c	-	matmulType_as_number	-
-Modules/_testcapimodule.c	-	meth_class_methods	-
-Modules/_testcapimodule.c	-	meth_instance_methods	-
-Modules/_testcapimodule.c	-	meth_static_methods	-
-Modules/_testcapimodule.c	-	ml	-
-Modules/_testcapimodule.c	-	str1	-
-Modules/_testcapimodule.c	-	str2	-
-Modules/_testcapimodule.c	-	test_members	-
-Modules/_testcapimodule.c	-	test_run_counter	-
-Modules/_testcapimodule.c	-	test_structmembersType	-
-Modules/_testcapimodule.c	-	thread_done	-
-Modules/_testcapimodule.c	-	x	-
-Modules/_testcapimodule.c	getargs_keyword_only	keywords	-
-Modules/_testcapimodule.c	getargs_keywords	keywords	-
-Modules/_testcapimodule.c	getargs_positional_only_and_keywords	keywords	-
-Modules/_testcapimodule.c	getargs_s_hash_int2	keywords	static char*[]
-Modules/_testcapimodule.c	make_exception_with_doc	kwlist	-
-Modules/_testcapimodule.c	raise_SIGINT_then_send_None	PyId_send	-
-Modules/_testcapimodule.c	slot_tp_del	PyId___tp_del__	-
-Modules/_testcapimodule.c	test_capsule	buffer	-
-Modules/_testcapimodule.c	test_empty_argparse	kwlist	-
-Modules/_testcapimodule.c	test_structmembers_new	keywords	-
-Modules/_testcapimodule.c	getargs_s_hash_int	keywords	-
-Modules/_testcapimodule.c	-	g_dict_watch_events	-
-Modules/_testcapimodule.c	-	g_dict_watchers_installed	-
-Modules/_testcapimodule.c	-	g_type_modified_events	-
-Modules/_testcapimodule.c	-	g_type_watchers_installed	-
-Modules/_testimportmultiple.c	-	_barmodule	-
-Modules/_testimportmultiple.c	-	_foomodule	-
-Modules/_testimportmultiple.c	-	_testimportmultiple	-
-Modules/_testinternalcapi.c	-	TestMethods	-
-Modules/_testinternalcapi.c	-	_testcapimodule	-
-Modules/_testmultiphase.c	-	Example_Type_slots	-
-Modules/_testmultiphase.c	-	Example_Type_spec	-
-Modules/_testmultiphase.c	-	Example_methods	-
-Modules/_testmultiphase.c	-	StateAccessType_Type_slots	-
-Modules/_testmultiphase.c	-	StateAccessType_methods	-
-Modules/_testmultiphase.c	-	StateAccessType_spec	-
-Modules/_testmultiphase.c	-	Str_Type_slots	-
-Modules/_testmultiphase.c	-	Str_Type_spec	-
-Modules/_testmultiphase.c	-	def_bad_large	-
-Modules/_testmultiphase.c	-	def_bad_negative	-
-Modules/_testmultiphase.c	-	def_create_int_with_state	-
-Modules/_testmultiphase.c	-	def_create_null	-
-Modules/_testmultiphase.c	-	def_create_raise	-
-Modules/_testmultiphase.c	-	def_create_unreported_exception	-
-Modules/_testmultiphase.c	-	def_exec_err	-
-Modules/_testmultiphase.c	-	def_exec_raise	-
-Modules/_testmultiphase.c	-	def_exec_unreported_exception	-
-Modules/_testmultiphase.c	-	def_meth_state_access	-
-Modules/_testmultiphase.c	-	def_negative_size	-
-Modules/_testmultiphase.c	-	def_nonascii_kana	-
-Modules/_testmultiphase.c	-	def_nonascii_latin	-
-Modules/_testmultiphase.c	-	def_nonmodule	-
-Modules/_testmultiphase.c	-	def_nonmodule_with_exec_slots	-
-Modules/_testmultiphase.c	-	def_nonmodule_with_methods	-
-Modules/_testmultiphase.c	-	imp_dummy_def	-
-Modules/_testmultiphase.c	-	main_def	-
-Modules/_testmultiphase.c	-	main_slots	-
-Modules/_testmultiphase.c	-	meth_state_access_slots	-
-Modules/_testmultiphase.c	-	nonmodule_methods	-
-Modules/_testmultiphase.c	-	null_slots_def	-
-Modules/_testmultiphase.c	-	slots_bad_large	-
-Modules/_testmultiphase.c	-	slots_bad_negative	-
-Modules/_testmultiphase.c	-	slots_create_nonmodule	-
-Modules/_testmultiphase.c	-	slots_create_nonmodule	-
-Modules/_testmultiphase.c	-	slots_create_null	-
-Modules/_testmultiphase.c	-	slots_create_raise	-
-Modules/_testmultiphase.c	-	slots_create_unreported_exception	-
-Modules/_testmultiphase.c	-	slots_exec_err	-
-Modules/_testmultiphase.c	-	slots_exec_raise	-
-Modules/_testmultiphase.c	-	slots_exec_unreported_exception	-
-Modules/_testmultiphase.c	-	slots_nonmodule_with_exec_slots	-
-Modules/_testmultiphase.c	-	testexport_methods	-
-Modules/_testmultiphase.c	-	uninitialized_def	-
-Modules/_xxtestfuzz/_xxtestfuzz.c	-	_fuzzmodule	-
-Modules/_xxtestfuzz/_xxtestfuzz.c	-	module_methods	-
-Modules/_xxtestfuzz/fuzzer.c	-	SRE_FLAG_DEBUG	-
-Modules/_xxtestfuzz/fuzzer.c	-	ast_literal_eval_method	-
-Modules/_xxtestfuzz/fuzzer.c	-	compiled_patterns	-
-Modules/_xxtestfuzz/fuzzer.c	-	csv_error	-
-Modules/_xxtestfuzz/fuzzer.c	-	csv_module	-
-Modules/_xxtestfuzz/fuzzer.c	-	json_loads_method	-
-Modules/_xxtestfuzz/fuzzer.c	-	regex_patterns	-
-Modules/_xxtestfuzz/fuzzer.c	-	sre_compile_method	-
-Modules/_xxtestfuzz/fuzzer.c	-	sre_error_exception	-
-Modules/_xxtestfuzz/fuzzer.c	-	struct_error	-
-Modules/_xxtestfuzz/fuzzer.c	-	struct_unpack_method	-
-Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	CSV_READER_INITIALIZED	-
-Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	JSON_LOADS_INITIALIZED	-
-Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	SRE_COMPILE_INITIALIZED	-
-Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	SRE_MATCH_INITIALIZED	-
-Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	STRUCT_UNPACK_INITIALIZED	-
-Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	AST_LITERAL_EVAL_INITIALIZED	-
-
-
-##################################
-# should be const
-# XXX Make them const.
-
-# These are all variables that we will be leaving global.
-
-# All module defs, type defs, etc. are handled in c-analyzr/cpython/_analyzer.py.
-# All kwlist arrays are handled in c-analyzr/cpython/_analyzer.py.
-
-#-----------------------
-# other vars that are actually constant
+# other vars that are actually constant
 
 Include/internal/pycore_blocks_output_buffer.h	-	BUFFER_BLOCK_SIZE	-
 Modules/_csv.c	-	quote_styles	-
@@ -646,3 +353,327 @@ Python/stdlib_module_names.h	-	_Py_stdlib_module_names	-
 Python/sysmodule.c	-	_PySys_ImplCacheTag	-
 Python/sysmodule.c	-	_PySys_ImplName	-
 Python/sysmodule.c	-	whatstrings	-
+
+##-----------------------
+## test code
+
+Modules/_ctypes/_ctypes_test.c	-	_ctypes_test_slots	-
+Modules/_ctypes/_ctypes_test.c	-	_ctypes_testmodule	-
+Modules/_ctypes/_ctypes_test.c	-	_xxx_lib	-
+Modules/_ctypes/_ctypes_test.c	-	an_integer	-
+Modules/_ctypes/_ctypes_test.c	-	bottom	-
+Modules/_ctypes/_ctypes_test.c	-	last_tf_arg_s	-
+Modules/_ctypes/_ctypes_test.c	-	last_tf_arg_u	-
+Modules/_ctypes/_ctypes_test.c	-	last_tfrsuv_arg	-
+Modules/_ctypes/_ctypes_test.c	-	left	-
+Modules/_ctypes/_ctypes_test.c	-	module_methods	-
+Modules/_ctypes/_ctypes_test.c	-	my_eggs	-
+Modules/_ctypes/_ctypes_test.c	-	my_spams	-
+Modules/_ctypes/_ctypes_test.c	-	right	-
+Modules/_ctypes/_ctypes_test.c	-	top	-
+Modules/_testbuffer.c	-	NDArray_Type	-
+Modules/_testbuffer.c	-	StaticArray_Type	-
+Modules/_testbuffer.c	-	Struct	-
+Modules/_testbuffer.c	-	_testbuffer_functions	-
+Modules/_testbuffer.c	-	_testbuffermodule	-
+Modules/_testbuffer.c	-	calcsize	-
+Modules/_testbuffer.c	-	infobuf	-
+Modules/_testbuffer.c	-	ndarray_as_buffer	-
+Modules/_testbuffer.c	-	ndarray_as_mapping	-
+Modules/_testbuffer.c	-	ndarray_as_sequence	-
+Modules/_testbuffer.c	-	ndarray_getset	-
+Modules/_testbuffer.c	-	ndarray_methods	-
+Modules/_testbuffer.c	-	simple_fmt	-
+Modules/_testbuffer.c	-	simple_format	-
+Modules/_testbuffer.c	-	static_buffer	-
+Modules/_testbuffer.c	-	static_mem	-
+Modules/_testbuffer.c	-	static_shape	-
+Modules/_testbuffer.c	-	static_strides	-
+Modules/_testbuffer.c	-	staticarray_as_buffer	-
+Modules/_testbuffer.c	-	structmodule	-
+Modules/_testbuffer.c	ndarray_init	kwlist	-
+Modules/_testbuffer.c	ndarray_memoryview_from_buffer	format	-
+Modules/_testbuffer.c	ndarray_memoryview_from_buffer	info	-
+Modules/_testbuffer.c	ndarray_memoryview_from_buffer	shape	-
+Modules/_testbuffer.c	ndarray_memoryview_from_buffer	strides	-
+Modules/_testbuffer.c	ndarray_memoryview_from_buffer	suboffsets	-
+Modules/_testbuffer.c	ndarray_push	kwlist	-
+Modules/_testbuffer.c	staticarray_init	kwlist	-
+Modules/_testcapi/heaptype.c	-	_testcapimodule	-
+Modules/_testcapi/unicode.c	-	_testcapimodule	-
+Modules/_testcapimodule.c	-	ContainerNoGC_members	-
+Modules/_testcapimodule.c	-	ContainerNoGC_type	-
+Modules/_testcapimodule.c	-	FmData	-
+Modules/_testcapimodule.c	-	FmHook	-
+Modules/_testcapimodule.c	-	GenericAlias_Type	-
+Modules/_testcapimodule.c	-	Generic_Type	-
+Modules/_testcapimodule.c	-	HeapCTypeSetattr_slots	-
+Modules/_testcapimodule.c	-	HeapCTypeSetattr_spec	-
+Modules/_testcapimodule.c	-	HeapCTypeSubclassWithFinalizer_slots	-
+Modules/_testcapimodule.c	-	HeapCTypeSubclassWithFinalizer_spec	-
+Modules/_testcapimodule.c	-	HeapCTypeSubclass_slots	-
+Modules/_testcapimodule.c	-	HeapCTypeSubclass_spec	-
+Modules/_testcapimodule.c	-	HeapCTypeWithBuffer_slots	-
+Modules/_testcapimodule.c	-	HeapCTypeWithBuffer_spec	-
+Modules/_testcapimodule.c	-	HeapCTypeWithDict_slots	-
+Modules/_testcapimodule.c	-	HeapCTypeWithDict_spec	-
+Modules/_testcapimodule.c	-	HeapCTypeWithNegativeDict_slots	-
+Modules/_testcapimodule.c	-	HeapCTypeWithNegativeDict_spec	-
+Modules/_testcapimodule.c	-	HeapCTypeWithWeakref_slots	-
+Modules/_testcapimodule.c	-	HeapCTypeWithWeakref_spec	-
+Modules/_testcapimodule.c	-	HeapCType_slots	-
+Modules/_testcapimodule.c	-	HeapCType_spec	-
+Modules/_testcapimodule.c	-	HeapDocCType_slots	-
+Modules/_testcapimodule.c	-	HeapDocCType_spec	-
+Modules/_testcapimodule.c	-	HeapGcCType_slots	-
+Modules/_testcapimodule.c	-	HeapGcCType_spec	-
+Modules/_testcapimodule.c	-	MethClass_Type	-
+Modules/_testcapimodule.c	-	MethInstance_Type	-
+Modules/_testcapimodule.c	-	MethStatic_Type	-
+Modules/_testcapimodule.c	-	MethodDescriptor2_Type	-
+Modules/_testcapimodule.c	-	MethodDescriptorBase_Type	-
+Modules/_testcapimodule.c	-	MethodDescriptorDerived_Type	-
+Modules/_testcapimodule.c	-	MethodDescriptorNopGet_Type	-
+Modules/_testcapimodule.c	-	MyList_Type	-
+Modules/_testcapimodule.c	-	PyRecursingInfinitelyError_Type	-
+Modules/_testcapimodule.c	-	TestError	-
+Modules/_testcapimodule.c	-	TestMethods	-
+Modules/_testcapimodule.c	-	_HashInheritanceTester_Type	-
+Modules/_testcapimodule.c	-	_testcapimodule	-
+Modules/_testcapimodule.c	-	awaitType	-
+Modules/_testcapimodule.c	-	awaitType_as_async	-
+Modules/_testcapimodule.c	-	capsule_context	-
+Modules/_testcapimodule.c	-	capsule_destructor_call_count	-
+Modules/_testcapimodule.c	-	capsule_error	-
+Modules/_testcapimodule.c	-	capsule_name	-
+Modules/_testcapimodule.c	-	capsule_pointer	-
+Modules/_testcapimodule.c	-	decimal_initialized	-
+Modules/_testcapimodule.c	-	generic_alias_methods	-
+Modules/_testcapimodule.c	-	generic_methods	-
+Modules/_testcapimodule.c	-	heapctype_members	-
+Modules/_testcapimodule.c	-	heapctypesetattr_members	-
+Modules/_testcapimodule.c	-	heapctypesubclass_members	-
+Modules/_testcapimodule.c	-	heapctypewithdict_getsetlist	-
+Modules/_testcapimodule.c	-	heapctypewithdict_members	-
+Modules/_testcapimodule.c	-	heapctypewithnegativedict_members	-
+Modules/_testcapimodule.c	-	heapctypewithweakref_members	-
+Modules/_testcapimodule.c	-	ipowType	-
+Modules/_testcapimodule.c	-	ipowType_as_number	-
+Modules/_testcapimodule.c	-	matmulType	-
+Modules/_testcapimodule.c	-	matmulType_as_number	-
+Modules/_testcapimodule.c	-	meth_class_methods	-
+Modules/_testcapimodule.c	-	meth_instance_methods	-
+Modules/_testcapimodule.c	-	meth_static_methods	-
+Modules/_testcapimodule.c	-	ml	-
+Modules/_testcapimodule.c	-	str1	-
+Modules/_testcapimodule.c	-	str2	-
+Modules/_testcapimodule.c	-	test_members	-
+Modules/_testcapimodule.c	-	test_run_counter	-
+Modules/_testcapimodule.c	-	test_structmembersType	-
+Modules/_testcapimodule.c	-	thread_done	-
+Modules/_testcapimodule.c	-	x	-
+Modules/_testcapimodule.c	getargs_keyword_only	keywords	-
+Modules/_testcapimodule.c	getargs_keywords	keywords	-
+Modules/_testcapimodule.c	getargs_positional_only_and_keywords	keywords	-
+Modules/_testcapimodule.c	getargs_s_hash_int2	keywords	static char*[]
+Modules/_testcapimodule.c	make_exception_with_doc	kwlist	-
+Modules/_testcapimodule.c	raise_SIGINT_then_send_None	PyId_send	-
+Modules/_testcapimodule.c	slot_tp_del	PyId___tp_del__	-
+Modules/_testcapimodule.c	test_capsule	buffer	-
+Modules/_testcapimodule.c	test_empty_argparse	kwlist	-
+Modules/_testcapimodule.c	test_structmembers_new	keywords	-
+Modules/_testcapimodule.c	getargs_s_hash_int	keywords	-
+Modules/_testcapimodule.c	-	g_dict_watch_events	-
+Modules/_testcapimodule.c	-	g_dict_watchers_installed	-
+Modules/_testcapimodule.c	-	g_type_modified_events	-
+Modules/_testcapimodule.c	-	g_type_watchers_installed	-
+Modules/_testimportmultiple.c	-	_barmodule	-
+Modules/_testimportmultiple.c	-	_foomodule	-
+Modules/_testimportmultiple.c	-	_testimportmultiple	-
+Modules/_testinternalcapi.c	-	TestMethods	-
+Modules/_testinternalcapi.c	-	_testcapimodule	-
+Modules/_testmultiphase.c	-	Example_Type_slots	-
+Modules/_testmultiphase.c	-	Example_Type_spec	-
+Modules/_testmultiphase.c	-	Example_methods	-
+Modules/_testmultiphase.c	-	StateAccessType_Type_slots	-
+Modules/_testmultiphase.c	-	StateAccessType_methods	-
+Modules/_testmultiphase.c	-	StateAccessType_spec	-
+Modules/_testmultiphase.c	-	Str_Type_slots	-
+Modules/_testmultiphase.c	-	Str_Type_spec	-
+Modules/_testmultiphase.c	-	def_bad_large	-
+Modules/_testmultiphase.c	-	def_bad_negative	-
+Modules/_testmultiphase.c	-	def_create_int_with_state	-
+Modules/_testmultiphase.c	-	def_create_null	-
+Modules/_testmultiphase.c	-	def_create_raise	-
+Modules/_testmultiphase.c	-	def_create_unreported_exception	-
+Modules/_testmultiphase.c	-	def_exec_err	-
+Modules/_testmultiphase.c	-	def_exec_raise	-
+Modules/_testmultiphase.c	-	def_exec_unreported_exception	-
+Modules/_testmultiphase.c	-	def_meth_state_access	-
+Modules/_testmultiphase.c	-	def_negative_size	-
+Modules/_testmultiphase.c	-	def_nonascii_kana	-
+Modules/_testmultiphase.c	-	def_nonascii_latin	-
+Modules/_testmultiphase.c	-	def_nonmodule	-
+Modules/_testmultiphase.c	-	def_nonmodule_with_exec_slots	-
+Modules/_testmultiphase.c	-	def_nonmodule_with_methods	-
+Modules/_testmultiphase.c	-	imp_dummy_def	-
+Modules/_testmultiphase.c	-	main_def	-
+Modules/_testmultiphase.c	-	main_slots	-
+Modules/_testmultiphase.c	-	meth_state_access_slots	-
+Modules/_testmultiphase.c	-	nonmodule_methods	-
+Modules/_testmultiphase.c	-	null_slots_def	-
+Modules/_testmultiphase.c	-	slots_bad_large	-
+Modules/_testmultiphase.c	-	slots_bad_negative	-
+Modules/_testmultiphase.c	-	slots_create_nonmodule	-
+Modules/_testmultiphase.c	-	slots_create_nonmodule	-
+Modules/_testmultiphase.c	-	slots_create_null	-
+Modules/_testmultiphase.c	-	slots_create_raise	-
+Modules/_testmultiphase.c	-	slots_create_unreported_exception	-
+Modules/_testmultiphase.c	-	slots_exec_err	-
+Modules/_testmultiphase.c	-	slots_exec_raise	-
+Modules/_testmultiphase.c	-	slots_exec_unreported_exception	-
+Modules/_testmultiphase.c	-	slots_nonmodule_with_exec_slots	-
+Modules/_testmultiphase.c	-	testexport_methods	-
+Modules/_testmultiphase.c	-	uninitialized_def	-
+Modules/_xxtestfuzz/_xxtestfuzz.c	-	_fuzzmodule	-
+Modules/_xxtestfuzz/_xxtestfuzz.c	-	module_methods	-
+Modules/_xxtestfuzz/fuzzer.c	-	SRE_FLAG_DEBUG	-
+Modules/_xxtestfuzz/fuzzer.c	-	ast_literal_eval_method	-
+Modules/_xxtestfuzz/fuzzer.c	-	compiled_patterns	-
+Modules/_xxtestfuzz/fuzzer.c	-	csv_error	-
+Modules/_xxtestfuzz/fuzzer.c	-	csv_module	-
+Modules/_xxtestfuzz/fuzzer.c	-	json_loads_method	-
+Modules/_xxtestfuzz/fuzzer.c	-	regex_patterns	-
+Modules/_xxtestfuzz/fuzzer.c	-	sre_compile_method	-
+Modules/_xxtestfuzz/fuzzer.c	-	sre_error_exception	-
+Modules/_xxtestfuzz/fuzzer.c	-	struct_error	-
+Modules/_xxtestfuzz/fuzzer.c	-	struct_unpack_method	-
+Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	CSV_READER_INITIALIZED	-
+Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	JSON_LOADS_INITIALIZED	-
+Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	SRE_COMPILE_INITIALIZED	-
+Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	SRE_MATCH_INITIALIZED	-
+Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	STRUCT_UNPACK_INITIALIZED	-
+Modules/_xxtestfuzz/fuzzer.c	LLVMFuzzerTestOneInput	AST_LITERAL_EVAL_INITIALIZED	-
+
+##-----------------------
+## the analyzer should have ignored these
+# XXX Fix the analyzer.
+
+## forward/extern references
+Include/py_curses.h	-	PyCurses_API	-
+Include/pydecimal.h	-	_decimal_api	-
+Modules/_blake2/blake2module.c	-	blake2b_type_spec	-
+Modules/_blake2/blake2module.c	-	blake2s_type_spec	-
+Modules/_io/fileio.c	-	_Py_open_cloexec_works	-
+Modules/_io/_iomodule.h	-	PyIOBase_Type	-
+Modules/_io/_iomodule.h	-	PyRawIOBase_Type	-
+Modules/_io/_iomodule.h	-	PyBufferedIOBase_Type	-
+Modules/_io/_iomodule.h	-	PyTextIOBase_Type	-
+Modules/_io/_iomodule.h	-	PyFileIO_Type	-
+Modules/_io/_iomodule.h	-	PyBytesIO_Type	-
+Modules/_io/_iomodule.h	-	PyStringIO_Type	-
+Modules/_io/_iomodule.h	-	PyBufferedReader_Type	-
+Modules/_io/_iomodule.h	-	PyBufferedWriter_Type	-
+Modules/_io/_iomodule.h	-	PyBufferedRWPair_Type	-
+Modules/_io/_iomodule.h	-	PyBufferedRandom_Type	-
+Modules/_io/_iomodule.h	-	PyTextIOWrapper_Type	-
+Modules/_io/_iomodule.h	-	PyIncrementalNewlineDecoder_Type	-
+Modules/_io/_iomodule.h	-	_PyBytesIOBuffer_Type	-
+Modules/_io/_iomodule.h	-	_PyIO_Module	-
+Modules/_io/_iomodule.h	-	_PyIO_str_close	-
+Modules/_io/_iomodule.h	-	_PyIO_str_closed	-
+Modules/_io/_iomodule.h	-	_PyIO_str_decode	-
+Modules/_io/_iomodule.h	-	_PyIO_str_encode	-
+Modules/_io/_iomodule.h	-	_PyIO_str_fileno	-
+Modules/_io/_iomodule.h	-	_PyIO_str_flush	-
+Modules/_io/_iomodule.h	-	_PyIO_str_getstate	-
+Modules/_io/_iomodule.h	-	_PyIO_str_isatty	-
+Modules/_io/_iomodule.h	-	_PyIO_str_newlines	-
+Modules/_io/_iomodule.h	-	_PyIO_str_nl	-
+Modules/_io/_iomodule.h	-	_PyIO_str_peek	-
+Modules/_io/_iomodule.h	-	_PyIO_str_read	-
+Modules/_io/_iomodule.h	-	_PyIO_str_read1	-
+Modules/_io/_iomodule.h	-	_PyIO_str_readable	-
+Modules/_io/_iomodule.h	-	_PyIO_str_readall	-
+Modules/_io/_iomodule.h	-	_PyIO_str_readinto	-
+Modules/_io/_iomodule.h	-	_PyIO_str_readline	-
+Modules/_io/_iomodule.h	-	_PyIO_str_reset	-
+Modules/_io/_iomodule.h	-	_PyIO_str_seek	-
+Modules/_io/_iomodule.h	-	_PyIO_str_seekable	-
+Modules/_io/_iomodule.h	-	_PyIO_str_setstate	-
+Modules/_io/_iomodule.h	-	_PyIO_str_tell	-
+Modules/_io/_iomodule.h	-	_PyIO_str_truncate	-
+Modules/_io/_iomodule.h	-	_PyIO_str_writable	-
+Modules/_io/_iomodule.h	-	_PyIO_str_write	-
+Modules/_io/_iomodule.h	-	_PyIO_empty_str	-
+Modules/_io/_iomodule.h	-	_PyIO_empty_bytes	-
+Modules/_multiprocessing/multiprocessing.h	-	_PyMp_SemLockType	-
+Modules/_sqlite/module.c	-	_pysqlite_converters	-
+Modules/_sqlite/module.c	-	_pysqlite_enable_callback_tracebacks	-
+Modules/_sqlite/module.c	-	pysqlite_BaseTypeAdapted	-
+Modules/_sqlite/module.h	-	pysqlite_global_state	-
+Modules/_testcapimodule.c	-	_PyBytesIOBuffer_Type	-
+Modules/posixmodule.c	-	_Py_open_cloexec_works	-
+Modules/posixmodule.c	-	environ	-
+Objects/object.c	-	_Py_GenericAliasIterType	-
+Objects/object.c	-	_PyMemoryIter_Type	-
+Objects/object.c	-	_PyLineIterator	-
+Objects/object.c	-	_PyPositionsIterator	-
+Python/perf_trampoline.c	-	_Py_trampoline_func_start	-
+Python/perf_trampoline.c	-	_Py_trampoline_func_end	-
+Python/importdl.h	-	_PyImport_DynLoadFiletab	-
+Modules/expat/xmlrole.c	-	prolog0	-
+Modules/expat/xmlrole.c	-	prolog1	-
+Modules/expat/xmlrole.c	-	prolog2	-
+Modules/expat/xmlrole.c	-	doctype0	-
+Modules/expat/xmlrole.c	-	doctype1	-
+Modules/expat/xmlrole.c	-	doctype2	-
+Modules/expat/xmlrole.c	-	doctype3	-
+Modules/expat/xmlrole.c	-	doctype4	-
+Modules/expat/xmlrole.c	-	doctype5	-
+Modules/expat/xmlrole.c	-	internalSubset	-
+Modules/expat/xmlrole.c	-	entity0	-
+Modules/expat/xmlrole.c	-	entity1	-
+Modules/expat/xmlrole.c	-	entity2	-
+Modules/expat/xmlrole.c	-	entity3	-
+Modules/expat/xmlrole.c	-	entity4	-
+Modules/expat/xmlrole.c	-	entity5	-
+Modules/expat/xmlrole.c	-	entity6	-
+Modules/expat/xmlrole.c	-	entity7	-
+Modules/expat/xmlrole.c	-	entity8	-
+Modules/expat/xmlrole.c	-	entity9	-
+Modules/expat/xmlrole.c	-	entity10	-
+Modules/expat/xmlrole.c	-	notation0	-
+Modules/expat/xmlrole.c	-	notation1	-
+Modules/expat/xmlrole.c	-	notation2	-
+Modules/expat/xmlrole.c	-	notation3	-
+Modules/expat/xmlrole.c	-	notation4	-
+Modules/expat/xmlrole.c	-	attlist0	-
+Modules/expat/xmlrole.c	-	attlist1	-
+Modules/expat/xmlrole.c	-	attlist2	-
+Modules/expat/xmlrole.c	-	attlist3	-
+Modules/expat/xmlrole.c	-	attlist4	-
+Modules/expat/xmlrole.c	-	attlist5	-
+Modules/expat/xmlrole.c	-	attlist6	-
+Modules/expat/xmlrole.c	-	attlist7	-
+Modules/expat/xmlrole.c	-	attlist8	-
+Modules/expat/xmlrole.c	-	attlist9	-
+Modules/expat/xmlrole.c	-	element0	-
+Modules/expat/xmlrole.c	-	element1	-
+Modules/expat/xmlrole.c	-	element2	-
+Modules/expat/xmlrole.c	-	element3	-
+Modules/expat/xmlrole.c	-	element4	-
+Modules/expat/xmlrole.c	-	element5	-
+Modules/expat/xmlrole.c	-	element6	-
+Modules/expat/xmlrole.c	-	element7	-
+Modules/expat/xmlrole.c	-	externalSubset0	-
+Modules/expat/xmlrole.c	-	externalSubset1	-
+Modules/expat/xmlrole.c	-	condSect0	-
+Modules/expat/xmlrole.c	-	condSect1	-
+Modules/expat/xmlrole.c	-	condSect2	-
+Modules/expat/xmlrole.c	-	declClose	-
+Modules/expat/xmlrole.c	-	error	-
+
+## other
+Modules/_io/_iomodule.c	-	_PyIO_Module	-
+Modules/_sqlite/module.c	-	_sqlite3module	-
diff --git a/Tools/c-analyzer/table-file.py b/Tools/c-analyzer/table-file.py
index 3cc05cc9de77..d36f814415c8 100644
--- a/Tools/c-analyzer/table-file.py
+++ b/Tools/c-analyzer/table-file.py
@@ -1,43 +1,59 @@
 
+KINDS = [
+    'section-major',
+    'section-minor',
+    'section-group',
+    'row',
+]
+
+
 def iter_clean_lines(lines):
     lines = iter(lines)
-    for line in lines:
-        line = line.strip()
-        if line.startswith('# XXX'):
+    for rawline in lines:
+        line = rawline.strip()
+        if line.startswith('#') and not rawline.startswith('##'):
             continue
-        yield line
+        yield line, rawline
 
 
 def parse_table_lines(lines):
     lines = iter_clean_lines(lines)
 
-    for line in lines:
-        if line.startswith(('####', '#----')):
-            kind = 0 if line[1] == '#' else 1
-            try:
-                line = next(lines).strip()
-            except StopIteration:
-                line = ''
-            if not line.startswith('# '):
-                raise NotImplementedError(line)
-            yield kind, line[2:].lstrip()
-            continue
-
-        maybe = None
-        while line.startswith('#'):
-            if line != '#' and line[1] == ' ':
-                maybe = line[2:].lstrip()
-            try:
-                line = next(lines).strip()
-            except StopIteration:
-                return
-            if not line:
-                break
-        else:
-            if line:
-                if maybe:
-                    yield 2, maybe
-                yield 'row', line
+    group = None
+    prev = ''
+    for line, rawline in lines:
+        if line.startswith('## '):
+            assert not rawline.startswith(' '), (line, rawline)
+            if group:
+                assert prev, (line, rawline)
+                kind, after, _ = group
+                assert kind and kind != 'section-group', (group, line, rawline)
+                assert after is not None, (group, line, rawline)
+            else:
+                assert not prev, (prev, line, rawline)
+                kind, after = group = ('section-group', None)
+            title = line[3:].lstrip()
+            assert title, (line, rawline)
+            if after is not None:
+                try:
+                    line, rawline = next(lines)
+                except StopIteration:
+                    line = None
+                if line != after:
+                    raise NotImplementedError((group, line, rawline))
+            yield kind, title
+            group = None
+        elif group:
+            raise NotImplementedError((group, line, rawline))
+        elif line.startswith('##---'):
+            assert line.rstrip('-') == '##', (line, rawline)
+            group = ('section-minor', '', line)
+        elif line.startswith('#####'):
+            assert not line.strip('#'), (line, rawline)
+            group = ('section-major', '', line)
+        elif line:
+            yield 'row', line
+        prev = line
 
 
 def iter_sections(lines):
@@ -49,12 +65,13 @@ def iter_sections(lines):
                 if header is None:
                     header = value
                     continue
-                raise NotImplementedError(value)
+                raise NotImplementedError(repr(value))
             yield tuple(section), value
         else:
             if header is None:
                 header = False
-            section[kind:] = [value]
+            start = KINDS.index(kind)
+            section[start:] = [value]
 
 
 def collect_sections(lines):



More information about the Python-checkins mailing list