summaryrefslogtreecommitdiffstats
path: root/Include/internal
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2022-02-08 20:39:07 (GMT)
committerGitHub <noreply@github.com>2022-02-08 20:39:07 (GMT)
commit81c72044a181dbbfbf689d7a977d0d99090f26a8 (patch)
tree14329746bd6f179cf2ae7c9818e1ae881eb46360 /Include/internal
parentc018d3037b5b62e6d48d5985d1a37b91762fbffb (diff)
downloadcpython-81c72044a181dbbfbf689d7a977d0d99090f26a8.zip
cpython-81c72044a181dbbfbf689d7a977d0d99090f26a8.tar.gz
cpython-81c72044a181dbbfbf689d7a977d0d99090f26a8.tar.bz2
bpo-46541: Replace core use of _Py_IDENTIFIER() with statically initialized global objects. (gh-30928)
We're no longer using _Py_IDENTIFIER() (or _Py_static_string()) in any core CPython code. It is still used in a number of non-builtin stdlib modules. The replacement is: PyUnicodeObject (not pointer) fields under _PyRuntimeState, statically initialized as part of _PyRuntime. A new _Py_GET_GLOBAL_IDENTIFIER() macro facilitates lookup of the fields (along with _Py_GET_GLOBAL_STRING() for non-identifier strings). https://bugs.python.org/issue46541#msg411799 explains the rationale for this change. The core of the change is in: * (new) Include/internal/pycore_global_strings.h - the declarations for the global strings, along with the macros * Include/internal/pycore_runtime_init.h - added the static initializers for the global strings * Include/internal/pycore_global_objects.h - where the struct in pycore_global_strings.h is hooked into _PyRuntimeState * Tools/scripts/generate_global_objects.py - added generation of the global string declarations and static initializers I've also added a --check flag to generate_global_objects.py (along with make check-global-objects) to check for unused global strings. That check is added to the PR CI config. The remainder of this change updates the core code to use _Py_GET_GLOBAL_IDENTIFIER() instead of _Py_IDENTIFIER() and the related _Py*Id functions (likewise for _Py_GET_GLOBAL_STRING() instead of _Py_static_string()). This includes adding a few functions where there wasn't already an alternative to _Py*Id(), replacing the _Py_Identifier * parameter with PyObject *. The following are not changed (yet): * stop using _Py_IDENTIFIER() in the stdlib modules * (maybe) get rid of _Py_IDENTIFIER(), etc. entirely -- this may not be doable as at least one package on PyPI using this (private) API * (maybe) intern the strings during runtime init https://bugs.python.org/issue46541
Diffstat (limited to 'Include/internal')
-rw-r--r--Include/internal/pycore_call.h3
-rw-r--r--Include/internal/pycore_global_objects.h4
-rw-r--r--Include/internal/pycore_global_strings.h337
-rw-r--r--Include/internal/pycore_object.h4
-rw-r--r--Include/internal/pycore_runtime_init.h313
-rw-r--r--Include/internal/pycore_structseq.h5
-rw-r--r--Include/internal/pycore_sysmodule.h2
-rw-r--r--Include/internal/pycore_unicodeobject.h2
8 files changed, 662 insertions, 8 deletions
diff --git a/Include/internal/pycore_call.h b/Include/internal/pycore_call.h
index f2cfd2f..3ccacfa 100644
--- a/Include/internal/pycore_call.h
+++ b/Include/internal/pycore_call.h
@@ -30,6 +30,9 @@ PyAPI_FUNC(PyObject *) _PyObject_Call(
PyObject *args,
PyObject *kwargs);
+extern PyObject * _PyObject_CallMethodFormat(
+ PyThreadState *tstate, PyObject *callable, const char *format, ...);
+
// Static inline variant of public PyVectorcall_Function().
static inline vectorcallfunc
diff --git a/Include/internal/pycore_global_objects.h b/Include/internal/pycore_global_objects.h
index acf0b2a..2135fa3 100644
--- a/Include/internal/pycore_global_objects.h
+++ b/Include/internal/pycore_global_objects.h
@@ -8,6 +8,8 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif
+#include "pycore_global_strings.h" // struct _Py_global_strings
+
// These would be in pycore_long.h if it weren't for an include cycle.
#define _PY_NSMALLPOSINTS 257
@@ -36,6 +38,8 @@ struct _Py_global_objects {
PyBytesObject ob;
char eos;
} bytes_characters[256];
+
+ struct _Py_global_strings strings;
} singletons;
};
diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h
new file mode 100644
index 0000000..17241b3
--- /dev/null
+++ b/Include/internal/pycore_global_strings.h
@@ -0,0 +1,337 @@
+#ifndef Py_INTERNAL_GLOBAL_STRINGS_H
+#define Py_INTERNAL_GLOBAL_STRINGS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+// The data structure & init here are inspired by Tools/scripts/deepfreeze.py.
+
+// All field names generated by ASCII_STR() have a common prefix,
+// to help avoid collisions with keywords, etc.
+
+#define STRUCT_FOR_ASCII_STR(LITERAL) \
+ struct { \
+ PyASCIIObject _ascii; \
+ uint8_t _data[sizeof(LITERAL)]; \
+ }
+#define STRUCT_FOR_STR(NAME, LITERAL) \
+ STRUCT_FOR_ASCII_STR(LITERAL) _ ## NAME;
+#define STRUCT_FOR_ID(NAME) \
+ STRUCT_FOR_ASCII_STR(#NAME) _ ## NAME;
+
+// XXX Order by frequency of use?
+
+/* The following is auto-generated by Tools/scripts/generate_global_objects.py. */
+struct _Py_global_strings {
+ struct {
+ STRUCT_FOR_STR(empty, "")
+ STRUCT_FOR_STR(dot, ".")
+ STRUCT_FOR_STR(comma_sep, ", ")
+ STRUCT_FOR_STR(percent, "%")
+ STRUCT_FOR_STR(dbl_percent, "%%")
+
+ // "anonymous" labels
+ STRUCT_FOR_STR(anon_dictcomp, "<dictcomp>")
+ STRUCT_FOR_STR(anon_genexpr, "<genexpr>")
+ STRUCT_FOR_STR(anon_lambda, "<lambda>")
+ STRUCT_FOR_STR(anon_listcomp, "<listcomp>")
+ STRUCT_FOR_STR(anon_module, "<module>")
+ STRUCT_FOR_STR(anon_setcomp, "<setcomp>")
+ STRUCT_FOR_STR(anon_string, "<string>")
+ STRUCT_FOR_STR(dot_locals, ".<locals>")
+ } literals;
+
+ struct {
+ STRUCT_FOR_ID(Py_Repr)
+ STRUCT_FOR_ID(TextIOWrapper)
+ STRUCT_FOR_ID(WarningMessage)
+ STRUCT_FOR_ID(_)
+ STRUCT_FOR_ID(__IOBase_closed)
+ STRUCT_FOR_ID(__abc_tpflags__)
+ STRUCT_FOR_ID(__abs__)
+ STRUCT_FOR_ID(__abstractmethods__)
+ STRUCT_FOR_ID(__add__)
+ STRUCT_FOR_ID(__aenter__)
+ STRUCT_FOR_ID(__aexit__)
+ STRUCT_FOR_ID(__aiter__)
+ STRUCT_FOR_ID(__all__)
+ STRUCT_FOR_ID(__and__)
+ STRUCT_FOR_ID(__anext__)
+ STRUCT_FOR_ID(__annotations__)
+ STRUCT_FOR_ID(__args__)
+ STRUCT_FOR_ID(__await__)
+ STRUCT_FOR_ID(__bases__)
+ STRUCT_FOR_ID(__bool__)
+ STRUCT_FOR_ID(__build_class__)
+ STRUCT_FOR_ID(__builtins__)
+ STRUCT_FOR_ID(__bytes__)
+ STRUCT_FOR_ID(__call__)
+ STRUCT_FOR_ID(__cantrace__)
+ STRUCT_FOR_ID(__class__)
+ STRUCT_FOR_ID(__class_getitem__)
+ STRUCT_FOR_ID(__classcell__)
+ STRUCT_FOR_ID(__complex__)
+ STRUCT_FOR_ID(__contains__)
+ STRUCT_FOR_ID(__copy__)
+ STRUCT_FOR_ID(__del__)
+ STRUCT_FOR_ID(__delattr__)
+ STRUCT_FOR_ID(__delete__)
+ STRUCT_FOR_ID(__delitem__)
+ STRUCT_FOR_ID(__dict__)
+ STRUCT_FOR_ID(__dir__)
+ STRUCT_FOR_ID(__divmod__)
+ STRUCT_FOR_ID(__doc__)
+ STRUCT_FOR_ID(__enter__)
+ STRUCT_FOR_ID(__eq__)
+ STRUCT_FOR_ID(__exit__)
+ STRUCT_FOR_ID(__file__)
+ STRUCT_FOR_ID(__float__)
+ STRUCT_FOR_ID(__floordiv__)
+ STRUCT_FOR_ID(__format__)
+ STRUCT_FOR_ID(__fspath__)
+ STRUCT_FOR_ID(__ge__)
+ STRUCT_FOR_ID(__get__)
+ STRUCT_FOR_ID(__getattr__)
+ STRUCT_FOR_ID(__getattribute__)
+ STRUCT_FOR_ID(__getinitargs__)
+ STRUCT_FOR_ID(__getitem__)
+ STRUCT_FOR_ID(__getnewargs__)
+ STRUCT_FOR_ID(__getnewargs_ex__)
+ STRUCT_FOR_ID(__getstate__)
+ STRUCT_FOR_ID(__gt__)
+ STRUCT_FOR_ID(__hash__)
+ STRUCT_FOR_ID(__iadd__)
+ STRUCT_FOR_ID(__iand__)
+ STRUCT_FOR_ID(__ifloordiv__)
+ STRUCT_FOR_ID(__ilshift__)
+ STRUCT_FOR_ID(__imatmul__)
+ STRUCT_FOR_ID(__imod__)
+ STRUCT_FOR_ID(__import__)
+ STRUCT_FOR_ID(__imul__)
+ STRUCT_FOR_ID(__index__)
+ STRUCT_FOR_ID(__init__)
+ STRUCT_FOR_ID(__init_subclass__)
+ STRUCT_FOR_ID(__instancecheck__)
+ STRUCT_FOR_ID(__int__)
+ STRUCT_FOR_ID(__invert__)
+ STRUCT_FOR_ID(__ior__)
+ STRUCT_FOR_ID(__ipow__)
+ STRUCT_FOR_ID(__irshift__)
+ STRUCT_FOR_ID(__isabstractmethod__)
+ STRUCT_FOR_ID(__isub__)
+ STRUCT_FOR_ID(__iter__)
+ STRUCT_FOR_ID(__itruediv__)
+ STRUCT_FOR_ID(__ixor__)
+ STRUCT_FOR_ID(__le__)
+ STRUCT_FOR_ID(__len__)
+ STRUCT_FOR_ID(__length_hint__)
+ STRUCT_FOR_ID(__loader__)
+ STRUCT_FOR_ID(__lshift__)
+ STRUCT_FOR_ID(__lt__)
+ STRUCT_FOR_ID(__ltrace__)
+ STRUCT_FOR_ID(__main__)
+ STRUCT_FOR_ID(__matmul__)
+ STRUCT_FOR_ID(__missing__)
+ STRUCT_FOR_ID(__mod__)
+ STRUCT_FOR_ID(__module__)
+ STRUCT_FOR_ID(__mro_entries__)
+ STRUCT_FOR_ID(__mul__)
+ STRUCT_FOR_ID(__name__)
+ STRUCT_FOR_ID(__ne__)
+ STRUCT_FOR_ID(__neg__)
+ STRUCT_FOR_ID(__new__)
+ STRUCT_FOR_ID(__newobj__)
+ STRUCT_FOR_ID(__newobj_ex__)
+ STRUCT_FOR_ID(__next__)
+ STRUCT_FOR_ID(__note__)
+ STRUCT_FOR_ID(__or__)
+ STRUCT_FOR_ID(__origin__)
+ STRUCT_FOR_ID(__package__)
+ STRUCT_FOR_ID(__parameters__)
+ STRUCT_FOR_ID(__path__)
+ STRUCT_FOR_ID(__pos__)
+ STRUCT_FOR_ID(__pow__)
+ STRUCT_FOR_ID(__prepare__)
+ STRUCT_FOR_ID(__qualname__)
+ STRUCT_FOR_ID(__radd__)
+ STRUCT_FOR_ID(__rand__)
+ STRUCT_FOR_ID(__rdivmod__)
+ STRUCT_FOR_ID(__reduce__)
+ STRUCT_FOR_ID(__reduce_ex__)
+ STRUCT_FOR_ID(__repr__)
+ STRUCT_FOR_ID(__reversed__)
+ STRUCT_FOR_ID(__rfloordiv__)
+ STRUCT_FOR_ID(__rlshift__)
+ STRUCT_FOR_ID(__rmatmul__)
+ STRUCT_FOR_ID(__rmod__)
+ STRUCT_FOR_ID(__rmul__)
+ STRUCT_FOR_ID(__ror__)
+ STRUCT_FOR_ID(__round__)
+ STRUCT_FOR_ID(__rpow__)
+ STRUCT_FOR_ID(__rrshift__)
+ STRUCT_FOR_ID(__rshift__)
+ STRUCT_FOR_ID(__rsub__)
+ STRUCT_FOR_ID(__rtruediv__)
+ STRUCT_FOR_ID(__rxor__)
+ STRUCT_FOR_ID(__set__)
+ STRUCT_FOR_ID(__set_name__)
+ STRUCT_FOR_ID(__setattr__)
+ STRUCT_FOR_ID(__setitem__)
+ STRUCT_FOR_ID(__setstate__)
+ STRUCT_FOR_ID(__sizeof__)
+ STRUCT_FOR_ID(__slotnames__)
+ STRUCT_FOR_ID(__slots__)
+ STRUCT_FOR_ID(__spec__)
+ STRUCT_FOR_ID(__str__)
+ STRUCT_FOR_ID(__sub__)
+ STRUCT_FOR_ID(__subclasscheck__)
+ STRUCT_FOR_ID(__subclasshook__)
+ STRUCT_FOR_ID(__truediv__)
+ STRUCT_FOR_ID(__trunc__)
+ STRUCT_FOR_ID(__warningregistry__)
+ STRUCT_FOR_ID(__weakref__)
+ STRUCT_FOR_ID(__xor__)
+ STRUCT_FOR_ID(_abc_impl)
+ STRUCT_FOR_ID(_blksize)
+ STRUCT_FOR_ID(_dealloc_warn)
+ STRUCT_FOR_ID(_finalizing)
+ STRUCT_FOR_ID(_find_and_load)
+ STRUCT_FOR_ID(_fix_up_module)
+ STRUCT_FOR_ID(_get_sourcefile)
+ STRUCT_FOR_ID(_handle_fromlist)
+ STRUCT_FOR_ID(_initializing)
+ STRUCT_FOR_ID(_is_text_encoding)
+ STRUCT_FOR_ID(_lock_unlock_module)
+ STRUCT_FOR_ID(_showwarnmsg)
+ STRUCT_FOR_ID(_shutdown)
+ STRUCT_FOR_ID(_slotnames)
+ STRUCT_FOR_ID(_strptime_time)
+ STRUCT_FOR_ID(_uninitialized_submodules)
+ STRUCT_FOR_ID(_warn_unawaited_coroutine)
+ STRUCT_FOR_ID(_xoptions)
+ STRUCT_FOR_ID(add)
+ STRUCT_FOR_ID(append)
+ STRUCT_FOR_ID(big)
+ STRUCT_FOR_ID(buffer)
+ STRUCT_FOR_ID(builtins)
+ STRUCT_FOR_ID(clear)
+ STRUCT_FOR_ID(close)
+ STRUCT_FOR_ID(code)
+ STRUCT_FOR_ID(copy)
+ STRUCT_FOR_ID(copyreg)
+ STRUCT_FOR_ID(decode)
+ STRUCT_FOR_ID(default)
+ STRUCT_FOR_ID(defaultaction)
+ STRUCT_FOR_ID(difference_update)
+ STRUCT_FOR_ID(dispatch_table)
+ STRUCT_FOR_ID(displayhook)
+ STRUCT_FOR_ID(enable)
+ STRUCT_FOR_ID(encoding)
+ STRUCT_FOR_ID(end_lineno)
+ STRUCT_FOR_ID(end_offset)
+ STRUCT_FOR_ID(errors)
+ STRUCT_FOR_ID(excepthook)
+ STRUCT_FOR_ID(extend)
+ STRUCT_FOR_ID(filename)
+ STRUCT_FOR_ID(fileno)
+ STRUCT_FOR_ID(fillvalue)
+ STRUCT_FOR_ID(filters)
+ STRUCT_FOR_ID(find_class)
+ STRUCT_FOR_ID(flush)
+ STRUCT_FOR_ID(get)
+ STRUCT_FOR_ID(get_source)
+ STRUCT_FOR_ID(getattr)
+ STRUCT_FOR_ID(ignore)
+ STRUCT_FOR_ID(importlib)
+ STRUCT_FOR_ID(intersection)
+ STRUCT_FOR_ID(isatty)
+ STRUCT_FOR_ID(items)
+ STRUCT_FOR_ID(iter)
+ STRUCT_FOR_ID(keys)
+ STRUCT_FOR_ID(last_traceback)
+ STRUCT_FOR_ID(last_type)
+ STRUCT_FOR_ID(last_value)
+ STRUCT_FOR_ID(latin1)
+ STRUCT_FOR_ID(lineno)
+ STRUCT_FOR_ID(little)
+ STRUCT_FOR_ID(match)
+ STRUCT_FOR_ID(metaclass)
+ STRUCT_FOR_ID(mode)
+ STRUCT_FOR_ID(modules)
+ STRUCT_FOR_ID(mro)
+ STRUCT_FOR_ID(msg)
+ STRUCT_FOR_ID(n_fields)
+ STRUCT_FOR_ID(n_sequence_fields)
+ STRUCT_FOR_ID(n_unnamed_fields)
+ STRUCT_FOR_ID(name)
+ STRUCT_FOR_ID(obj)
+ STRUCT_FOR_ID(offset)
+ STRUCT_FOR_ID(onceregistry)
+ STRUCT_FOR_ID(open)
+ STRUCT_FOR_ID(parent)
+ STRUCT_FOR_ID(partial)
+ STRUCT_FOR_ID(path)
+ STRUCT_FOR_ID(peek)
+ STRUCT_FOR_ID(persistent_id)
+ STRUCT_FOR_ID(persistent_load)
+ STRUCT_FOR_ID(print_file_and_line)
+ STRUCT_FOR_ID(ps1)
+ STRUCT_FOR_ID(ps2)
+ STRUCT_FOR_ID(raw)
+ STRUCT_FOR_ID(read)
+ STRUCT_FOR_ID(read1)
+ STRUCT_FOR_ID(readable)
+ STRUCT_FOR_ID(readall)
+ STRUCT_FOR_ID(readinto)
+ STRUCT_FOR_ID(readinto1)
+ STRUCT_FOR_ID(readline)
+ STRUCT_FOR_ID(reducer_override)
+ STRUCT_FOR_ID(reload)
+ STRUCT_FOR_ID(replace)
+ STRUCT_FOR_ID(reset)
+ STRUCT_FOR_ID(return)
+ STRUCT_FOR_ID(reversed)
+ STRUCT_FOR_ID(seek)
+ STRUCT_FOR_ID(seekable)
+ STRUCT_FOR_ID(send)
+ STRUCT_FOR_ID(setstate)
+ STRUCT_FOR_ID(sort)
+ STRUCT_FOR_ID(stderr)
+ STRUCT_FOR_ID(stdin)
+ STRUCT_FOR_ID(stdout)
+ STRUCT_FOR_ID(strict)
+ STRUCT_FOR_ID(symmetric_difference_update)
+ STRUCT_FOR_ID(tell)
+ STRUCT_FOR_ID(text)
+ STRUCT_FOR_ID(threading)
+ STRUCT_FOR_ID(throw)
+ STRUCT_FOR_ID(unraisablehook)
+ STRUCT_FOR_ID(values)
+ STRUCT_FOR_ID(version)
+ STRUCT_FOR_ID(warnings)
+ STRUCT_FOR_ID(warnoptions)
+ STRUCT_FOR_ID(writable)
+ STRUCT_FOR_ID(write)
+ STRUCT_FOR_ID(zipimporter)
+ } identifiers;
+};
+/* End auto-generated code */
+
+#undef ID
+#undef STR
+
+
+#define _Py_ID(NAME) \
+ (_Py_SINGLETON(strings.identifiers._ ## NAME._ascii.ob_base))
+#define _Py_STR(NAME) \
+ (_Py_SINGLETON(strings.literals._ ## NAME._ascii.ob_base))
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_GLOBAL_STRINGS_H */
diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h
index e2da253..65abc18 100644
--- a/Include/internal/pycore_object.h
+++ b/Include/internal/pycore_object.h
@@ -8,9 +8,11 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif
+#include <stdbool.h>
#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED()
#include "pycore_interp.h" // PyInterpreterState.gc
#include "pycore_pystate.h" // _PyInterpreterState_GET()
+#include "pycore_runtime.h" // _PyRuntime
#define _PyObject_IMMORTAL_INIT(type) \
@@ -236,6 +238,8 @@ extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
#define _PyHeapType_GET_MEMBERS(etype) \
((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize))
+PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, PyObject *);
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h
index 3b7f262..045ae5d 100644
--- a/Include/internal/pycore_runtime_init.h
+++ b/Include/internal/pycore_runtime_init.h
@@ -82,7 +82,6 @@ extern "C" {
.ob_digit = { ((val) >= 0 ? (val) : -(val)) }, \
}
-
#define _PyBytes_SIMPLE_INIT(CH, LEN) \
{ \
_PyVarObject_IMMORTAL_INIT(&PyBytes_Type, LEN), \
@@ -94,6 +93,26 @@ extern "C" {
_PyBytes_SIMPLE_INIT(CH, 1) \
}
+#define _PyASCIIObject_INIT(LITERAL) \
+ { \
+ ._ascii = { \
+ .ob_base = _PyObject_IMMORTAL_INIT(&PyUnicode_Type), \
+ .length = sizeof(LITERAL) - 1, \
+ .hash = -1, \
+ .state = { \
+ .kind = 1, \
+ .compact = 1, \
+ .ascii = 1, \
+ .ready = 1, \
+ }, \
+ }, \
+ ._data = LITERAL, \
+ }
+#define INIT_STR(NAME, LITERAL) \
+ ._ ## NAME = _PyASCIIObject_INIT(LITERAL)
+#define INIT_ID(NAME) \
+ ._ ## NAME = _PyASCIIObject_INIT(#NAME)
+
/* The following is auto-generated by Tools/scripts/generate_global_objects.py. */
#define _Py_global_objects_INIT { \
@@ -622,6 +641,298 @@ extern "C" {
_PyBytes_CHAR_INIT(254), \
_PyBytes_CHAR_INIT(255), \
}, \
+ \
+ .strings = { \
+ .literals = { \
+ INIT_STR(empty, ""), \
+ INIT_STR(dot, "."), \
+ INIT_STR(comma_sep, ", "), \
+ INIT_STR(percent, "%"), \
+ INIT_STR(dbl_percent, "%%"), \
+ \
+ INIT_STR(anon_dictcomp, "<dictcomp>"), \
+ INIT_STR(anon_genexpr, "<genexpr>"), \
+ INIT_STR(anon_lambda, "<lambda>"), \
+ INIT_STR(anon_listcomp, "<listcomp>"), \
+ INIT_STR(anon_module, "<module>"), \
+ INIT_STR(anon_setcomp, "<setcomp>"), \
+ INIT_STR(anon_string, "<string>"), \
+ INIT_STR(dot_locals, ".<locals>"), \
+ }, \
+ .identifiers = { \
+ INIT_ID(Py_Repr), \
+ INIT_ID(TextIOWrapper), \
+ INIT_ID(WarningMessage), \
+ INIT_ID(_), \
+ INIT_ID(__IOBase_closed), \
+ INIT_ID(__abc_tpflags__), \
+ INIT_ID(__abs__), \
+ INIT_ID(__abstractmethods__), \
+ INIT_ID(__add__), \
+ INIT_ID(__aenter__), \
+ INIT_ID(__aexit__), \
+ INIT_ID(__aiter__), \
+ INIT_ID(__all__), \
+ INIT_ID(__and__), \
+ INIT_ID(__anext__), \
+ INIT_ID(__annotations__), \
+ INIT_ID(__args__), \
+ INIT_ID(__await__), \
+ INIT_ID(__bases__), \
+ INIT_ID(__bool__), \
+ INIT_ID(__build_class__), \
+ INIT_ID(__builtins__), \
+ INIT_ID(__bytes__), \
+ INIT_ID(__call__), \
+ INIT_ID(__cantrace__), \
+ INIT_ID(__class__), \
+ INIT_ID(__class_getitem__), \
+ INIT_ID(__classcell__), \
+ INIT_ID(__complex__), \
+ INIT_ID(__contains__), \
+ INIT_ID(__copy__), \
+ INIT_ID(__del__), \
+ INIT_ID(__delattr__), \
+ INIT_ID(__delete__), \
+ INIT_ID(__delitem__), \
+ INIT_ID(__dict__), \
+ INIT_ID(__dir__), \
+ INIT_ID(__divmod__), \
+ INIT_ID(__doc__), \
+ INIT_ID(__enter__), \
+ INIT_ID(__eq__), \
+ INIT_ID(__exit__), \
+ INIT_ID(__file__), \
+ INIT_ID(__float__), \
+ INIT_ID(__floordiv__), \
+ INIT_ID(__format__), \
+ INIT_ID(__fspath__), \
+ INIT_ID(__ge__), \
+ INIT_ID(__get__), \
+ INIT_ID(__getattr__), \
+ INIT_ID(__getattribute__), \
+ INIT_ID(__getinitargs__), \
+ INIT_ID(__getitem__), \
+ INIT_ID(__getnewargs__), \
+ INIT_ID(__getnewargs_ex__), \
+ INIT_ID(__getstate__), \
+ INIT_ID(__gt__), \
+ INIT_ID(__hash__), \
+ INIT_ID(__iadd__), \
+ INIT_ID(__iand__), \
+ INIT_ID(__ifloordiv__), \
+ INIT_ID(__ilshift__), \
+ INIT_ID(__imatmul__), \
+ INIT_ID(__imod__), \
+ INIT_ID(__import__), \
+ INIT_ID(__imul__), \
+ INIT_ID(__index__), \
+ INIT_ID(__init__), \
+ INIT_ID(__init_subclass__), \
+ INIT_ID(__instancecheck__), \
+ INIT_ID(__int__), \
+ INIT_ID(__invert__), \
+ INIT_ID(__ior__), \
+ INIT_ID(__ipow__), \
+ INIT_ID(__irshift__), \
+ INIT_ID(__isabstractmethod__), \
+ INIT_ID(__isub__), \
+ INIT_ID(__iter__), \
+ INIT_ID(__itruediv__), \
+ INIT_ID(__ixor__), \
+ INIT_ID(__le__), \
+ INIT_ID(__len__), \
+ INIT_ID(__length_hint__), \
+ INIT_ID(__loader__), \
+ INIT_ID(__lshift__), \
+ INIT_ID(__lt__), \
+ INIT_ID(__ltrace__), \
+ INIT_ID(__main__), \
+ INIT_ID(__matmul__), \
+ INIT_ID(__missing__), \
+ INIT_ID(__mod__), \
+ INIT_ID(__module__), \
+ INIT_ID(__mro_entries__), \
+ INIT_ID(__mul__), \
+ INIT_ID(__name__), \
+ INIT_ID(__ne__), \
+ INIT_ID(__neg__), \
+ INIT_ID(__new__), \
+ INIT_ID(__newobj__), \
+ INIT_ID(__newobj_ex__), \
+ INIT_ID(__next__), \
+ INIT_ID(__note__), \
+ INIT_ID(__or__), \
+ INIT_ID(__origin__), \
+ INIT_ID(__package__), \
+ INIT_ID(__parameters__), \
+ INIT_ID(__path__), \
+ INIT_ID(__pos__), \
+ INIT_ID(__pow__), \
+ INIT_ID(__prepare__), \
+ INIT_ID(__qualname__), \
+ INIT_ID(__radd__), \
+ INIT_ID(__rand__), \
+ INIT_ID(__rdivmod__), \
+ INIT_ID(__reduce__), \
+ INIT_ID(__reduce_ex__), \
+ INIT_ID(__repr__), \
+ INIT_ID(__reversed__), \
+ INIT_ID(__rfloordiv__), \
+ INIT_ID(__rlshift__), \
+ INIT_ID(__rmatmul__), \
+ INIT_ID(__rmod__), \
+ INIT_ID(__rmul__), \
+ INIT_ID(__ror__), \
+ INIT_ID(__round__), \
+ INIT_ID(__rpow__), \
+ INIT_ID(__rrshift__), \
+ INIT_ID(__rshift__), \
+ INIT_ID(__rsub__), \
+ INIT_ID(__rtruediv__), \
+ INIT_ID(__rxor__), \
+ INIT_ID(__set__), \
+ INIT_ID(__set_name__), \
+ INIT_ID(__setattr__), \
+ INIT_ID(__setitem__), \
+ INIT_ID(__setstate__), \
+ INIT_ID(__sizeof__), \
+ INIT_ID(__slotnames__), \
+ INIT_ID(__slots__), \
+ INIT_ID(__spec__), \
+ INIT_ID(__str__), \
+ INIT_ID(__sub__), \
+ INIT_ID(__subclasscheck__), \
+ INIT_ID(__subclasshook__), \
+ INIT_ID(__truediv__), \
+ INIT_ID(__trunc__), \
+ INIT_ID(__warningregistry__), \
+ INIT_ID(__weakref__), \
+ INIT_ID(__xor__), \
+ INIT_ID(_abc_impl), \
+ INIT_ID(_blksize), \
+ INIT_ID(_dealloc_warn), \
+ INIT_ID(_finalizing), \
+ INIT_ID(_find_and_load), \
+ INIT_ID(_fix_up_module), \
+ INIT_ID(_get_sourcefile), \
+ INIT_ID(_handle_fromlist), \
+ INIT_ID(_initializing), \
+ INIT_ID(_is_text_encoding), \
+ INIT_ID(_lock_unlock_module), \
+ INIT_ID(_showwarnmsg), \
+ INIT_ID(_shutdown), \
+ INIT_ID(_slotnames), \
+ INIT_ID(_strptime_time), \
+ INIT_ID(_uninitialized_submodules), \
+ INIT_ID(_warn_unawaited_coroutine), \
+ INIT_ID(_xoptions), \
+ INIT_ID(add), \
+ INIT_ID(append), \
+ INIT_ID(big), \
+ INIT_ID(buffer), \
+ INIT_ID(builtins), \
+ INIT_ID(clear), \
+ INIT_ID(close), \
+ INIT_ID(code), \
+ INIT_ID(copy), \
+ INIT_ID(copyreg), \
+ INIT_ID(decode), \
+ INIT_ID(default), \
+ INIT_ID(defaultaction), \
+ INIT_ID(difference_update), \
+ INIT_ID(dispatch_table), \
+ INIT_ID(displayhook), \
+ INIT_ID(enable), \
+ INIT_ID(encoding), \
+ INIT_ID(end_lineno), \
+ INIT_ID(end_offset), \
+ INIT_ID(errors), \
+ INIT_ID(excepthook), \
+ INIT_ID(extend), \
+ INIT_ID(filename), \
+ INIT_ID(fileno), \
+ INIT_ID(fillvalue), \
+ INIT_ID(filters), \
+ INIT_ID(find_class), \
+ INIT_ID(flush), \
+ INIT_ID(get), \
+ INIT_ID(get_source), \
+ INIT_ID(getattr), \
+ INIT_ID(ignore), \
+ INIT_ID(importlib), \
+ INIT_ID(intersection), \
+ INIT_ID(isatty), \
+ INIT_ID(items), \
+ INIT_ID(iter), \
+ INIT_ID(keys), \
+ INIT_ID(last_traceback), \
+ INIT_ID(last_type), \
+ INIT_ID(last_value), \
+ INIT_ID(latin1), \
+ INIT_ID(lineno), \
+ INIT_ID(little), \
+ INIT_ID(match), \
+ INIT_ID(metaclass), \
+ INIT_ID(mode), \
+ INIT_ID(modules), \
+ INIT_ID(mro), \
+ INIT_ID(msg), \
+ INIT_ID(n_fields), \
+ INIT_ID(n_sequence_fields), \
+ INIT_ID(n_unnamed_fields), \
+ INIT_ID(name), \
+ INIT_ID(obj), \
+ INIT_ID(offset), \
+ INIT_ID(onceregistry), \
+ INIT_ID(open), \
+ INIT_ID(parent), \
+ INIT_ID(partial), \
+ INIT_ID(path), \
+ INIT_ID(peek), \
+ INIT_ID(persistent_id), \
+ INIT_ID(persistent_load), \
+ INIT_ID(print_file_and_line), \
+ INIT_ID(ps1), \
+ INIT_ID(ps2), \
+ INIT_ID(raw), \
+ INIT_ID(read), \
+ INIT_ID(read1), \
+ INIT_ID(readable), \
+ INIT_ID(readall), \
+ INIT_ID(readinto), \
+ INIT_ID(readinto1), \
+ INIT_ID(readline), \
+ INIT_ID(reducer_override), \
+ INIT_ID(reload), \
+ INIT_ID(replace), \
+ INIT_ID(reset), \
+ INIT_ID(return), \
+ INIT_ID(reversed), \
+ INIT_ID(seek), \
+ INIT_ID(seekable), \
+ INIT_ID(send), \
+ INIT_ID(setstate), \
+ INIT_ID(sort), \
+ INIT_ID(stderr), \
+ INIT_ID(stdin), \
+ INIT_ID(stdout), \
+ INIT_ID(strict), \
+ INIT_ID(symmetric_difference_update), \
+ INIT_ID(tell), \
+ INIT_ID(text), \
+ INIT_ID(threading), \
+ INIT_ID(throw), \
+ INIT_ID(unraisablehook), \
+ INIT_ID(values), \
+ INIT_ID(version), \
+ INIT_ID(warnings), \
+ INIT_ID(warnoptions), \
+ INIT_ID(writable), \
+ INIT_ID(write), \
+ INIT_ID(zipimporter), \
+ }, \
+ }, \
}, \
}
/* End auto-generated code */
diff --git a/Include/internal/pycore_structseq.h b/Include/internal/pycore_structseq.h
index c0323bb..0199c79 100644
--- a/Include/internal/pycore_structseq.h
+++ b/Include/internal/pycore_structseq.h
@@ -9,11 +9,6 @@ extern "C" {
#endif
-/* runtime lifecycle */
-
-extern PyStatus _PyStructSequence_InitState(PyInterpreterState *);
-
-
/* other API */
PyAPI_FUNC(PyTypeObject *) _PyStructSequence_NewType(
diff --git a/Include/internal/pycore_sysmodule.h b/Include/internal/pycore_sysmodule.h
index 738a774..10d092c 100644
--- a/Include/internal/pycore_sysmodule.h
+++ b/Include/internal/pycore_sysmodule.h
@@ -18,6 +18,8 @@ PyAPI_FUNC(int) _PySys_Audit(
PyAPI_FUNC() to not export the symbol. */
extern void _PySys_ClearAuditHooks(PyThreadState *tstate);
+PyAPI_FUNC(int) _PySys_SetAttr(PyObject *, PyObject *);
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/internal/pycore_unicodeobject.h b/Include/internal/pycore_unicodeobject.h
index fabe522..977bbeb 100644
--- a/Include/internal/pycore_unicodeobject.h
+++ b/Include/internal/pycore_unicodeobject.h
@@ -44,8 +44,6 @@ struct _Py_unicode_ids {
};
struct _Py_unicode_state {
- // The empty Unicode object is a singleton to improve performance.
- PyObject *empty_string;
/* Single character Unicode strings in the Latin-1 range are being
shared as well. */
PyObject *latin1[256];