gh-101819: Remove _PyWindowsConsoleIO_Type from the Windows DLL (GH-101904)

Automerge-Triggered-By: GH:erlend-aasland
This commit is contained in:
Erlend E. Aasland 2023-02-15 14:07:59 +01:00 committed by GitHub
parent c7766245c1
commit eb0c485b6c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 29 additions and 14 deletions

View file

@ -577,6 +577,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) {
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(True)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(True));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(WarningMessage)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(WarningMessage));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_WindowsConsoleIO));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__IOBase_closed)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__IOBase_closed));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__abc_tpflags__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__abc_tpflags__));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__abs__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__abs__));
@ -752,6 +753,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) {
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_get_sourcefile)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_get_sourcefile));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_handle_fromlist)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_handle_fromlist));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_initializing)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_initializing));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_io));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_is_text_encoding)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_is_text_encoding));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_length_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_length_));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_limbo)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_limbo));

View file

@ -63,6 +63,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(True) STRUCT_FOR_ID(True)
STRUCT_FOR_ID(WarningMessage) STRUCT_FOR_ID(WarningMessage)
STRUCT_FOR_ID(_) STRUCT_FOR_ID(_)
STRUCT_FOR_ID(_WindowsConsoleIO)
STRUCT_FOR_ID(__IOBase_closed) STRUCT_FOR_ID(__IOBase_closed)
STRUCT_FOR_ID(__abc_tpflags__) STRUCT_FOR_ID(__abc_tpflags__)
STRUCT_FOR_ID(__abs__) STRUCT_FOR_ID(__abs__)
@ -238,6 +239,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(_get_sourcefile) STRUCT_FOR_ID(_get_sourcefile)
STRUCT_FOR_ID(_handle_fromlist) STRUCT_FOR_ID(_handle_fromlist)
STRUCT_FOR_ID(_initializing) STRUCT_FOR_ID(_initializing)
STRUCT_FOR_ID(_io)
STRUCT_FOR_ID(_is_text_encoding) STRUCT_FOR_ID(_is_text_encoding)
STRUCT_FOR_ID(_length_) STRUCT_FOR_ID(_length_)
STRUCT_FOR_ID(_limbo) STRUCT_FOR_ID(_limbo)

View file

@ -569,6 +569,7 @@ extern "C" {
INIT_ID(True), \ INIT_ID(True), \
INIT_ID(WarningMessage), \ INIT_ID(WarningMessage), \
INIT_ID(_), \ INIT_ID(_), \
INIT_ID(_WindowsConsoleIO), \
INIT_ID(__IOBase_closed), \ INIT_ID(__IOBase_closed), \
INIT_ID(__abc_tpflags__), \ INIT_ID(__abc_tpflags__), \
INIT_ID(__abs__), \ INIT_ID(__abs__), \
@ -744,6 +745,7 @@ extern "C" {
INIT_ID(_get_sourcefile), \ INIT_ID(_get_sourcefile), \
INIT_ID(_handle_fromlist), \ INIT_ID(_handle_fromlist), \
INIT_ID(_initializing), \ INIT_ID(_initializing), \
INIT_ID(_io), \
INIT_ID(_is_text_encoding), \ INIT_ID(_is_text_encoding), \
INIT_ID(_length_), \ INIT_ID(_length_), \
INIT_ID(_limbo), \ INIT_ID(_limbo), \

View file

@ -32,6 +32,8 @@ _PyUnicode_InitStaticStrings(void) {
PyUnicode_InternInPlace(&string); PyUnicode_InternInPlace(&string);
string = &_Py_ID(_); string = &_Py_ID(_);
PyUnicode_InternInPlace(&string); PyUnicode_InternInPlace(&string);
string = &_Py_ID(_WindowsConsoleIO);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(__IOBase_closed); string = &_Py_ID(__IOBase_closed);
PyUnicode_InternInPlace(&string); PyUnicode_InternInPlace(&string);
string = &_Py_ID(__abc_tpflags__); string = &_Py_ID(__abc_tpflags__);
@ -382,6 +384,8 @@ _PyUnicode_InitStaticStrings(void) {
PyUnicode_InternInPlace(&string); PyUnicode_InternInPlace(&string);
string = &_Py_ID(_initializing); string = &_Py_ID(_initializing);
PyUnicode_InternInPlace(&string); PyUnicode_InternInPlace(&string);
string = &_Py_ID(_io);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(_is_text_encoding); string = &_Py_ID(_is_text_encoding);
PyUnicode_InternInPlace(&string); PyUnicode_InternInPlace(&string);
string = &_Py_ID(_length_); string = &_Py_ID(_length_);

View file

@ -21,13 +21,9 @@ extern PyTypeObject PyBufferedRandom_Type;
extern PyTypeObject PyTextIOWrapper_Type; extern PyTypeObject PyTextIOWrapper_Type;
extern PyTypeObject PyIncrementalNewlineDecoder_Type; extern PyTypeObject PyIncrementalNewlineDecoder_Type;
#ifndef Py_LIMITED_API
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
extern PyTypeObject PyWindowsConsoleIO_Type; extern PyTypeObject PyWindowsConsoleIO_Type;
PyAPI_DATA(PyObject *) _PyWindowsConsoleIO_Type;
#define PyWindowsConsoleIO_Check(op) (PyObject_TypeCheck((op), (PyTypeObject*)_PyWindowsConsoleIO_Type))
#endif /* MS_WINDOWS */ #endif /* MS_WINDOWS */
#endif /* Py_LIMITED_API */
/* These functions are used as METH_NOARGS methods, are normally called /* These functions are used as METH_NOARGS methods, are normally called
* with args=NULL, and return a new reference. * with args=NULL, and return a new reference.

View file

@ -260,7 +260,7 @@ _io__WindowsConsoleIO___init___impl(winconsoleio *self, PyObject *nameobj,
int fd_is_own = 0; int fd_is_own = 0;
HANDLE handle = NULL; HANDLE handle = NULL;
assert(PyWindowsConsoleIO_Check(self)); assert(PyObject_TypeCheck(self, (PyTypeObject *)&PyWindowsConsoleIO_Type));
if (self->fd >= 0) { if (self->fd >= 0) {
if (self->closefd) { if (self->closefd) {
/* Have to close the existing file first. */ /* Have to close the existing file first. */
@ -1174,6 +1174,4 @@ PyTypeObject PyWindowsConsoleIO_Type = {
0, /* tp_finalize */ 0, /* tp_finalize */
}; };
PyObject * _PyWindowsConsoleIO_Type = (PyObject*)&PyWindowsConsoleIO_Type;
#endif /* MS_WINDOWS */ #endif /* MS_WINDOWS */

View file

@ -10,7 +10,7 @@
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
#include "pycore_fileutils.h" // _Py_get_osfhandle() #include "pycore_fileutils.h" // _Py_get_osfhandle()
#include "..\modules\_io\_iomodule.h" #include "pycore_runtime.h" // _Py_ID()
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -51,7 +51,14 @@ _testconsole_write_input_impl(PyObject *module, PyObject *file,
{ {
INPUT_RECORD *rec = NULL; INPUT_RECORD *rec = NULL;
if (!PyWindowsConsoleIO_Check(file)) { PyTypeObject *winconsoleio_type = (PyTypeObject *)_PyImport_GetModuleAttr(
&_Py_ID(_io), &_Py_ID(_WindowsConsoleIO));
if (winconsoleio_type == NULL) {
return NULL;
}
int is_subclass = PyObject_TypeCheck(file, winconsoleio_type);
Py_DECREF(winconsoleio_type);
if (!is_subclass) {
PyErr_SetString(PyExc_TypeError, "expected raw console object"); PyErr_SetString(PyExc_TypeError, "expected raw console object");
return NULL; return NULL;
} }

View file

@ -54,10 +54,6 @@ extern void _PyIO_Fini(void);
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
# undef BYTE # undef BYTE
extern PyTypeObject PyWindowsConsoleIO_Type;
# define PyWindowsConsoleIO_Check(op) \
(PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type))
#endif #endif
#define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str)) #define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str))
@ -2358,8 +2354,16 @@ create_stdio(const PyConfig *config, PyObject* io,
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
/* Windows console IO is always UTF-8 encoded */ /* Windows console IO is always UTF-8 encoded */
if (PyWindowsConsoleIO_Check(raw)) PyTypeObject *winconsoleio_type = (PyTypeObject *)_PyImport_GetModuleAttr(
&_Py_ID(_io), &_Py_ID(_WindowsConsoleIO));
if (winconsoleio_type == NULL) {
goto error;
}
int is_subclass = PyObject_TypeCheck(raw, winconsoleio_type);
Py_DECREF(winconsoleio_type);
if (is_subclass) {
encoding = L"utf-8"; encoding = L"utf-8";
}
#endif #endif
text = PyUnicode_FromString(name); text = PyUnicode_FromString(name);