mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
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
This commit is contained in:
parent
c018d3037b
commit
81c72044a1
108 changed files with 2282 additions and 1573 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
337
Include/internal/pycore_global_strings.h
Normal file
337
Include/internal/pycore_global_strings.h
Normal file
|
|
@ -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 */
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -9,11 +9,6 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
|
||||
/* runtime lifecycle */
|
||||
|
||||
extern PyStatus _PyStructSequence_InitState(PyInterpreterState *);
|
||||
|
||||
|
||||
/* other API */
|
||||
|
||||
PyAPI_FUNC(PyTypeObject *) _PyStructSequence_NewType(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue