@@ -52,6 +52,7 @@ PERFORMANCE OF THIS SOFTWARE.
5252#define TYPE_LIST '['
5353#define TYPE_DICT '{'
5454#define TYPE_CODE 'c'
55+ #define TYPE_UNICODE 'u'
5556#define TYPE_UNKNOWN '?'
5657
5758typedef struct {
@@ -213,9 +214,22 @@ w_object(v, p)
213214#endif
214215 else if (PyString_Check (v )) {
215216 w_byte (TYPE_STRING , p );
216- n = PyString_Size (v );
217+ n = PyString_GET_SIZE (v );
217218 w_long ((long )n , p );
218- w_string (PyString_AsString (v ), n , p );
219+ w_string (PyString_AS_STRING (v ), n , p );
220+ }
221+ else if (PyUnicode_Check (v )) {
222+ PyObject * utf8 ;
223+ utf8 = PyUnicode_AsUTF8String (v );
224+ if (utf8 == NULL ) {
225+ p -> error = 1 ;
226+ return ;
227+ }
228+ w_byte (TYPE_UNICODE , p );
229+ n = PyString_GET_SIZE (utf8 );
230+ w_long ((long )n , p );
231+ w_string (PyString_AS_STRING (utf8 ), n , p );
232+ Py_DECREF (utf8 );
219233 }
220234 else if (PyTuple_Check (v )) {
221235 w_byte (TYPE_TUPLE , p );
@@ -227,10 +241,10 @@ w_object(v, p)
227241 }
228242 else if (PyList_Check (v )) {
229243 w_byte (TYPE_LIST , p );
230- n = PyList_Size (v );
244+ n = PyList_GET_SIZE (v );
231245 w_long ((long )n , p );
232246 for (i = 0 ; i < n ; i ++ ) {
233- w_object (PyList_GetItem (v , i ), p );
247+ w_object (PyList_GET_ITEM (v , i ), p );
234248 }
235249 }
236250 else if (PyDict_Check (v )) {
@@ -482,7 +496,7 @@ r_object(p)
482496 }
483497 v = PyString_FromStringAndSize ((char * )NULL , n );
484498 if (v != NULL ) {
485- if (r_string (PyString_AsString (v ), (int )n , p ) != n ) {
499+ if (r_string (PyString_AS_STRING (v ), (int )n , p ) != n ) {
486500 Py_DECREF (v );
487501 v = NULL ;
488502 PyErr_SetString (PyExc_EOFError ,
@@ -491,6 +505,29 @@ r_object(p)
491505 }
492506 return v ;
493507
508+ case TYPE_UNICODE :
509+ {
510+ char * buffer ;
511+
512+ n = r_long (p );
513+ if (n < 0 ) {
514+ PyErr_SetString (PyExc_ValueError , "bad marshal data" );
515+ return NULL ;
516+ }
517+ buffer = (char * )Py_Malloc (n );
518+ if (buffer == NULL )
519+ return NULL ;
520+ if (r_string (buffer , (int )n , p ) != n ) {
521+ free (buffer );
522+ PyErr_SetString (PyExc_EOFError ,
523+ "EOF read where object expected" );
524+ return NULL ;
525+ }
526+ v = PyUnicode_DecodeUTF8 (buffer , n , NULL );
527+ free (buffer );
528+ return v ;
529+ }
530+
494531 case TYPE_TUPLE :
495532 n = r_long (p );
496533 if (n < 0 ) {
0 commit comments