Make marshalling errors a little more informative as to what went wrong
diff --git a/Python/marshal.c b/Python/marshal.c
index 140192f..3460bc3 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -576,7 +576,7 @@
 			n = r_long(p);
 			if (n < -INT_MAX || n > INT_MAX) {
 				PyErr_SetString(PyExc_ValueError,
-						"bad marshal data");
+						"bad marshal data (long size out of range)");
 				retval = NULL;
 				break;
 			}
@@ -592,7 +592,7 @@
 				if (digit < 0) {
 					Py_DECREF(ob);
 					PyErr_SetString(PyExc_ValueError,
-							"bad marshal data");
+							"bad marshal data (negative digit in long)");
 					ob = NULL;
 					break;
 				}
@@ -709,7 +709,7 @@
 	case TYPE_STRING:
 		n = r_long(p);
 		if (n < 0 || n > INT_MAX) {
-			PyErr_SetString(PyExc_ValueError, "bad marshal data");
+			PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
 			retval = NULL;
 			break;
 		}
@@ -738,7 +738,7 @@
 	case TYPE_STRINGREF:
 		n = r_long(p);
 		if (n < 0 || n >= PyList_GET_SIZE(p->strings)) {
-			PyErr_SetString(PyExc_ValueError, "bad marshal data");
+			PyErr_SetString(PyExc_ValueError, "bad marshal data (string ref out of range)");
 			retval = NULL;
 			break;
 		}
@@ -754,7 +754,7 @@
 
 		n = r_long(p);
 		if (n < 0 || n > INT_MAX) {
-			PyErr_SetString(PyExc_ValueError, "bad marshal data");
+			PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
 			retval = NULL;
 			break;
 		}
@@ -780,7 +780,7 @@
 	case TYPE_TUPLE:
 		n = r_long(p);
 		if (n < 0 || n > INT_MAX) {
-			PyErr_SetString(PyExc_ValueError, "bad marshal data");
+			PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
 			retval = NULL;
 			break;
 		}
@@ -794,7 +794,7 @@
 			if ( v2 == NULL ) {
 				if (!PyErr_Occurred())
 					PyErr_SetString(PyExc_TypeError,
-						"NULL object in marshal data");
+						"NULL object in marshal data for tuple");
 				Py_DECREF(v);
 				v = NULL;
 				break;
@@ -807,7 +807,7 @@
 	case TYPE_LIST:
 		n = r_long(p);
 		if (n < 0 || n > INT_MAX) {
-			PyErr_SetString(PyExc_ValueError, "bad marshal data");
+			PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
 			retval = NULL;
 			break;
 		}
@@ -821,7 +821,7 @@
 			if ( v2 == NULL ) {
 				if (!PyErr_Occurred())
 					PyErr_SetString(PyExc_TypeError,
-						"NULL object in marshal data");
+						"NULL object in marshal data for list");
 				Py_DECREF(v);
 				v = NULL;
 				break;
@@ -859,7 +859,7 @@
 	case TYPE_FROZENSET:
 		n = r_long(p);
 		if (n < 0 || n > INT_MAX) {
-			PyErr_SetString(PyExc_ValueError, "bad marshal data");
+			PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
 			retval = NULL;
 			break;
 		}
@@ -873,7 +873,7 @@
 			if ( v2 == NULL ) {
 				if (!PyErr_Occurred())
 					PyErr_SetString(PyExc_TypeError,
-						"NULL object in marshal data");
+						"NULL object in marshal data for set");
 				Py_DECREF(v);
 				v = NULL;
 				break;
@@ -973,7 +973,7 @@
 	default:
 		/* Bogus data got written, which isn't ideal.
 		   This will let you keep working and recover. */
-		PyErr_SetString(PyExc_ValueError, "bad marshal data");
+		PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
 		retval = NULL;
 		break;
 
@@ -992,7 +992,7 @@
 	}
 	v = r_object(p);
 	if (v == NULL && !PyErr_Occurred())
-		PyErr_SetString(PyExc_TypeError, "NULL object in marshal data");
+		PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
 	return v;
 }