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
2424static _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-
7775static PyObject *
7876make_tuple (PyObject * object , Py_ssize_t len )
7977{
@@ -1715,15 +1713,15 @@ static PyType_Spec reader_spec = {
17151713
17161714static int
17171715mbstreamwriter_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
17421741static 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
17601763static 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
17961806static 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