Skip to content

Commit 0cc6364

Browse files
authored
bpo-46541: Remove usage of _Py_IDENTIFIER from multibytecodec (GH-31475)
1 parent c60e6b6 commit 0cc6364

File tree

2 files changed

+103
-25
lines changed

2 files changed

+103
-25
lines changed

Modules/cjkcodecs/clinic/multibytecodec.c.h

+65-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Modules/cjkcodecs/multibytecodec.c

+38-18
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66

77
#define PY_SSIZE_T_CLEAN
8-
#define NEEDS_PY_IDENTIFIER
98
#include "Python.h"
109
#include "structmember.h" // PyMemberDef
1110
#include "multibytecodec.h"
@@ -19,6 +18,7 @@ typedef struct {
1918
PyTypeObject *reader_type;
2019
PyTypeObject *writer_type;
2120
PyTypeObject *multibytecodec_type;
21+
PyObject *str_write;
2222
} _multibytecodec_state;
2323

2424
static _multibytecodec_state *
@@ -72,8 +72,6 @@ static PyObject *multibytecodec_encode(MultibyteCodec *,
7272

7373
#define MBENC_RESET MBENC_MAX<<1 /* reset after an encoding session */
7474

75-
_Py_IDENTIFIER(write);
76-
7775
static PyObject *
7876
make_tuple(PyObject *object, Py_ssize_t len)
7977
{
@@ -1715,15 +1713,15 @@ static PyType_Spec reader_spec = {
17151713

17161714
static int
17171715
mbstreamwriter_iwrite(MultibyteStreamWriterObject *self,
1718-
PyObject *unistr)
1716+
PyObject *unistr, PyObject *str_write)
17191717
{
17201718
PyObject *str, *wr;
17211719

17221720
str = encoder_encode_stateful(STATEFUL_ECTX(self), unistr, 0);
17231721
if (str == NULL)
17241722
return -1;
17251723

1726-
wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, str);
1724+
wr = _PyObject_CallMethodOneArg(self->stream, str_write, str);
17271725
Py_DECREF(str);
17281726
if (wr == NULL)
17291727
return -1;
@@ -1735,32 +1733,38 @@ mbstreamwriter_iwrite(MultibyteStreamWriterObject *self,
17351733
/*[clinic input]
17361734
_multibytecodec.MultibyteStreamWriter.write
17371735
1736+
cls: defining_class
17381737
strobj: object
17391738
/
17401739
[clinic start generated code]*/
17411740

17421741
static PyObject *
1743-
_multibytecodec_MultibyteStreamWriter_write(MultibyteStreamWriterObject *self,
1744-
PyObject *strobj)
1745-
/*[clinic end generated code: output=e13ae841c895251e input=551dc4c018c10a2b]*/
1742+
_multibytecodec_MultibyteStreamWriter_write_impl(MultibyteStreamWriterObject *self,
1743+
PyTypeObject *cls,
1744+
PyObject *strobj)
1745+
/*[clinic end generated code: output=68ade3aea26410ac input=199f26f68bd8425a]*/
17461746
{
1747-
if (mbstreamwriter_iwrite(self, strobj))
1747+
_multibytecodec_state *state = PyType_GetModuleState(cls);
1748+
assert(state != NULL);
1749+
if (mbstreamwriter_iwrite(self, strobj, state->str_write)) {
17481750
return NULL;
1749-
else
1750-
Py_RETURN_NONE;
1751+
}
1752+
Py_RETURN_NONE;
17511753
}
17521754

17531755
/*[clinic input]
17541756
_multibytecodec.MultibyteStreamWriter.writelines
17551757
1758+
cls: defining_class
17561759
lines: object
17571760
/
17581761
[clinic start generated code]*/
17591762

17601763
static PyObject *
1761-
_multibytecodec_MultibyteStreamWriter_writelines(MultibyteStreamWriterObject *self,
1762-
PyObject *lines)
1763-
/*[clinic end generated code: output=e5c4285ac8e7d522 input=57797fe7008d4e96]*/
1764+
_multibytecodec_MultibyteStreamWriter_writelines_impl(MultibyteStreamWriterObject *self,
1765+
PyTypeObject *cls,
1766+
PyObject *lines)
1767+
/*[clinic end generated code: output=b4c99d2cf23ffb88 input=a6d5fe7c74972a34]*/
17641768
{
17651769
PyObject *strobj;
17661770
int i, r;
@@ -1771,13 +1775,15 @@ _multibytecodec_MultibyteStreamWriter_writelines(MultibyteStreamWriterObject *se
17711775
return NULL;
17721776
}
17731777

1778+
_multibytecodec_state *state = PyType_GetModuleState(cls);
1779+
assert(state != NULL);
17741780
for (i = 0; i < PySequence_Length(lines); i++) {
17751781
/* length can be changed even within this loop */
17761782
strobj = PySequence_GetItem(lines, i);
17771783
if (strobj == NULL)
17781784
return NULL;
17791785

1780-
r = mbstreamwriter_iwrite(self, strobj);
1786+
r = mbstreamwriter_iwrite(self, strobj, state->str_write);
17811787
Py_DECREF(strobj);
17821788
if (r == -1)
17831789
return NULL;
@@ -1791,11 +1797,16 @@ _multibytecodec_MultibyteStreamWriter_writelines(MultibyteStreamWriterObject *se
17911797

17921798
/*[clinic input]
17931799
_multibytecodec.MultibyteStreamWriter.reset
1800+
1801+
cls: defining_class
1802+
/
1803+
17941804
[clinic start generated code]*/
17951805

17961806
static PyObject *
1797-
_multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *self)
1798-
/*[clinic end generated code: output=8f54a4d9b03db5ff input=b56dbcbaf35cc10c]*/
1807+
_multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *self,
1808+
PyTypeObject *cls)
1809+
/*[clinic end generated code: output=32ef224c2a38aa3d input=28af6a9cd38d1979]*/
17991810
{
18001811
PyObject *pwrt;
18011812

@@ -1814,10 +1825,14 @@ _multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *se
18141825
return NULL;
18151826

18161827
assert(PyBytes_Check(pwrt));
1828+
1829+
_multibytecodec_state *state = PyType_GetModuleState(cls);
1830+
assert(state != NULL);
1831+
18171832
if (PyBytes_Size(pwrt) > 0) {
18181833
PyObject *wr;
18191834

1820-
wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, pwrt);
1835+
wr = _PyObject_CallMethodOneArg(self->stream, state->str_write, pwrt);
18211836
if (wr == NULL) {
18221837
Py_DECREF(pwrt);
18231838
return NULL;
@@ -1989,6 +2004,7 @@ _multibytecodec_clear(PyObject *mod)
19892004
Py_CLEAR(state->decoder_type);
19902005
Py_CLEAR(state->reader_type);
19912006
Py_CLEAR(state->writer_type);
2007+
Py_CLEAR(state->str_write);
19922008
return 0;
19932009
}
19942010

@@ -2017,6 +2033,10 @@ static int
20172033
_multibytecodec_exec(PyObject *mod)
20182034
{
20192035
_multibytecodec_state *state = _multibytecodec_get_state(mod);
2036+
state->str_write = PyUnicode_InternFromString("write");
2037+
if (state->str_write == NULL) {
2038+
return -1;
2039+
}
20202040
CREATE_TYPE(mod, state->multibytecodec_type, &multibytecodec_spec);
20212041
CREATE_TYPE(mod, state->encoder_type, &encoder_spec);
20222042
CREATE_TYPE(mod, state->decoder_type, &decoder_spec);

0 commit comments

Comments
 (0)