]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-90110: Clean Up the C-analyzer Globals Lists (gh-100091)
authorEric Snow <ericsnowcurrently@gmail.com>
Wed, 7 Dec 2022 22:02:47 +0000 (15:02 -0700)
committerGitHub <noreply@github.com>
Wed, 7 Dec 2022 22:02:47 +0000 (15:02 -0700)
https://github.com/python/cpython/issues/90110

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

index 27c093332f6725eccb78f6c2bb6cf2218c9b9def..f12dad095acaa84702f9d6d12a1c72f569384b23 100644 (file)
@@ -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
+}
index adbb319a1b6f89da8bfbd5fbec680ccbf8c65274..af5b7eb8eaf024c363abd20c537ca7dbd6d6acd3 100644 (file)
@@ -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      -
index 242deace8c945deafc119c4a8925e89c1456cb89..128336a997eba0c63516c0a274d22aea2d6d7876 100644 (file)
@@ -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  -
index 3cc05cc9de7779da734114a6e77d8b7a4c09661d..d36f814415c8e7640d4226401ad1d94781edcef2 100644 (file)
@@ -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):