Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
diff --git a/Python/marshal.c b/Python/marshal.c
index ddccc89..519081d 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -52,6 +52,7 @@
 #define TYPE_LIST	'['
 #define TYPE_DICT	'{'
 #define TYPE_CODE	'c'
+#define TYPE_UNICODE	'u'
 #define TYPE_UNKNOWN	'?'
 
 typedef struct {
@@ -213,9 +214,22 @@
 #endif
 	else if (PyString_Check(v)) {
 		w_byte(TYPE_STRING, p);
-		n = PyString_Size(v);
+		n = PyString_GET_SIZE(v);
 		w_long((long)n, p);
-		w_string(PyString_AsString(v), n, p);
+		w_string(PyString_AS_STRING(v), n, p);
+	}
+	else if (PyUnicode_Check(v)) {
+	        PyObject *utf8;
+		utf8 = PyUnicode_AsUTF8String(v);
+		if (utf8 == NULL) {
+		    p->error = 1;
+		    return;
+		}
+		w_byte(TYPE_UNICODE, p);
+		n = PyString_GET_SIZE(utf8);
+		w_long((long)n, p);
+		w_string(PyString_AS_STRING(utf8), n, p);
+		Py_DECREF(utf8);
 	}
 	else if (PyTuple_Check(v)) {
 		w_byte(TYPE_TUPLE, p);
@@ -227,10 +241,10 @@
 	}
 	else if (PyList_Check(v)) {
 		w_byte(TYPE_LIST, p);
-		n = PyList_Size(v);
+		n = PyList_GET_SIZE(v);
 		w_long((long)n, p);
 		for (i = 0; i < n; i++) {
-			w_object(PyList_GetItem(v, i), p);
+			w_object(PyList_GET_ITEM(v, i), p);
 		}
 	}
 	else if (PyDict_Check(v)) {
@@ -482,7 +496,7 @@
 		}
 		v = PyString_FromStringAndSize((char *)NULL, n);
 		if (v != NULL) {
-			if (r_string(PyString_AsString(v), (int)n, p) != n) {
+			if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
 				Py_DECREF(v);
 				v = NULL;
 				PyErr_SetString(PyExc_EOFError,
@@ -491,6 +505,29 @@
 		}
 		return v;
 	
+	case TYPE_UNICODE:
+	    {
+		char *buffer;
+
+		n = r_long(p);
+		if (n < 0) {
+			PyErr_SetString(PyExc_ValueError, "bad marshal data");
+			return NULL;
+		}
+		buffer = (char *)Py_Malloc(n);
+		if (buffer == NULL)
+		    return NULL;
+		if (r_string(buffer, (int)n, p) != n) {
+			free(buffer);
+			PyErr_SetString(PyExc_EOFError,
+				"EOF read where object expected");
+			return NULL;
+		}
+		v = PyUnicode_DecodeUTF8(buffer, n, NULL);
+		free(buffer);
+		return v;
+	    }
+	    
 	case TYPE_TUPLE:
 		n = r_long(p);
 		if (n < 0) {