Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c279b53

Browse files
committed
Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
1 parent e826ef0 commit c279b53

1 file changed

Lines changed: 42 additions & 5 deletions

File tree

Python/marshal.c

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5758
typedef 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

Comments
 (0)