@@ -121,9 +121,11 @@ code_repr(co)
121121{
122122 char buf [500 ];
123123 int lineno = -1 ;
124- char * p = PyString_AS_STRING ( co -> co_code ) ;
124+ unsigned char * p ;
125125 char * filename = "???" ;
126126 char * name = "???" ;
127+
128+ _PyCode_GETCODEPTR (co , & p );
127129 if (* p == SET_LINENO )
128130 lineno = (p [1 ] & 0xff ) | ((p [2 ] & 0xff ) << 8 );
129131 if (co -> co_filename && PyString_Check (co -> co_filename ))
@@ -146,8 +148,7 @@ code_compare(co, cp)
146148 if (cmp ) return cmp ;
147149 cmp = co -> co_flags - cp -> co_flags ;
148150 if (cmp ) return cmp ;
149- cmp = PyObject_Compare ((PyObject * )co -> co_code ,
150- (PyObject * )cp -> co_code );
151+ cmp = PyObject_Compare (co -> co_code , cp -> co_code );
151152 if (cmp ) return cmp ;
152153 cmp = PyObject_Compare (co -> co_consts , cp -> co_consts );
153154 if (cmp ) return cmp ;
@@ -162,7 +163,7 @@ code_hash(co)
162163 PyCodeObject * co ;
163164{
164165 long h , h1 , h2 , h3 , h4 ;
165- h1 = PyObject_Hash (( PyObject * ) co -> co_code );
166+ h1 = PyObject_Hash (co -> co_code );
166167 if (h1 == -1 ) return -1 ;
167168 h2 = PyObject_Hash (co -> co_consts );
168169 if (h2 == -1 ) return -1 ;
@@ -216,9 +217,10 @@ PyCode_New(argcount, nlocals, stacksize, flags,
216217{
217218 PyCodeObject * co ;
218219 int i ;
220+ PyBufferProcs * pb ;
219221 /* Check argument types */
220222 if (argcount < 0 || nlocals < 0 ||
221- code == NULL || ! PyString_Check ( code ) ||
223+ code == NULL ||
222224 consts == NULL || !PyTuple_Check (consts ) ||
223225 names == NULL || !PyTuple_Check (names ) ||
224226 varnames == NULL || !PyTuple_Check (varnames ) ||
@@ -228,6 +230,15 @@ PyCode_New(argcount, nlocals, stacksize, flags,
228230 PyErr_BadInternalCall ();
229231 return NULL ;
230232 }
233+ pb = code -> ob_type -> tp_as_buffer ;
234+ if (pb == NULL ||
235+ pb -> bf_getreadbuffer == NULL ||
236+ pb -> bf_getsegcount == NULL ||
237+ (* pb -> bf_getsegcount )(code , NULL ) != 1 )
238+ {
239+ PyErr_BadInternalCall ();
240+ return NULL ;
241+ }
231242 /* Make sure names and varnames are all strings, & intern them */
232243 for (i = PyTuple_Size (names ); -- i >= 0 ; ) {
233244 PyObject * v = PyTuple_GetItem (names , i );
@@ -264,7 +275,7 @@ PyCode_New(argcount, nlocals, stacksize, flags,
264275 co -> co_stacksize = stacksize ;
265276 co -> co_flags = flags ;
266277 Py_INCREF (code );
267- co -> co_code = ( PyStringObject * ) code ;
278+ co -> co_code = code ;
268279 Py_INCREF (consts );
269280 co -> co_consts = consts ;
270281 Py_INCREF (names );
0 commit comments