@@ -110,7 +110,7 @@ PyCode_New(int argcount, int kwonlyargcount,
110110 PyObject * lnotab )
111111{
112112 PyCodeObject * co ;
113- unsigned char * cell2arg = NULL ;
113+ Py_ssize_t * cell2arg = NULL ;
114114 Py_ssize_t i , n_cellvars ;
115115
116116 /* Check argument types */
@@ -142,19 +142,25 @@ PyCode_New(int argcount, int kwonlyargcount,
142142 if (n_cellvars ) {
143143 Py_ssize_t total_args = argcount + kwonlyargcount +
144144 ((flags & CO_VARARGS ) != 0 ) + ((flags & CO_VARKEYWORDS ) != 0 );
145- Py_ssize_t alloc_size = sizeof (unsigned char ) * n_cellvars ;
146145 bool used_cell2arg = false;
147- cell2arg = PyMem_MALLOC (alloc_size );
148- if (cell2arg == NULL )
146+ cell2arg = PyMem_NEW (Py_ssize_t , n_cellvars );
147+ if (cell2arg == NULL ) {
148+ PyErr_NoMemory ();
149149 return NULL ;
150- memset ( cell2arg , CO_CELL_NOT_AN_ARG , alloc_size );
150+ }
151151 /* Find cells which are also arguments. */
152152 for (i = 0 ; i < n_cellvars ; i ++ ) {
153153 Py_ssize_t j ;
154154 PyObject * cell = PyTuple_GET_ITEM (cellvars , i );
155+ cell2arg [i ] = CO_CELL_NOT_AN_ARG ;
155156 for (j = 0 ; j < total_args ; j ++ ) {
156157 PyObject * arg = PyTuple_GET_ITEM (varnames , j );
157- if (!PyUnicode_Compare (cell , arg )) {
158+ int cmp = PyUnicode_Compare (cell , arg );
159+ if (cmp == -1 && PyErr_Occurred ()) {
160+ PyMem_FREE (cell2arg );
161+ return NULL ;
162+ }
163+ if (cmp == 0 ) {
158164 cell2arg [i ] = j ;
159165 used_cell2arg = true;
160166 break ;
@@ -449,7 +455,7 @@ code_sizeof(PyCodeObject *co, void *unused)
449455
450456 res = _PyObject_SIZE (Py_TYPE (co ));
451457 if (co -> co_cell2arg != NULL && co -> co_cellvars != NULL )
452- res += PyTuple_GET_SIZE (co -> co_cellvars ) * sizeof (unsigned char );
458+ res += PyTuple_GET_SIZE (co -> co_cellvars ) * sizeof (Py_ssize_t );
453459 return PyLong_FromSsize_t (res );
454460}
455461
0 commit comments