diff Python/marshal.c @ 3234:aafe7d634985 legacy-trunk

Made a bit more robust against out-of-memory situations
author Jack Jansen <jack.jansen@cwi.nl>
date Fri, 27 Oct 1995 13:21:28 +0000
parents 6b9cb6634897
children 6098aaa8ae7f
line wrap: on
line diff
--- a/Python/marshal.c	Mon Oct 23 14:36:05 1995 +0000
+++ b/Python/marshal.c	Fri Oct 27 13:21:28 1995 +0000
@@ -280,7 +280,7 @@
 r_object(p)
 	RFILE *p;
 {
-	object *v;
+	object *v, *v2;
 	long i, n;
 	int type = r_byte(p);
 	
@@ -347,8 +347,15 @@
 		v = newtupleobject((int)n);
 		if (v == NULL)
 			return v;
-		for (i = 0; i < n; i++)
-			SETTUPLEITEM(v, (int)i, r_object(p));
+		for (i = 0; i < n; i++) {
+			v2 = r_object(p);
+			if ( v2 == NULL ) {
+				DECREF(v);
+				v = NULL;
+				break;
+			}
+			SETTUPLEITEM(v, (int)i, v2);
+		}
 		return v;
 	
 	case TYPE_LIST:
@@ -356,8 +363,15 @@
 		v = newlistobject((int)n);
 		if (v == NULL)
 			return v;
-		for (i = 0; i < n; i++)
-			setlistitem(v, (int)i, r_object(p));
+		for (i = 0; i < n; i++) {
+			v2 = r_object(p);
+			if ( v2 == NULL ) {
+				DECREF(v);
+				v = NULL;
+				break;
+			}
+			setlistitem(v, (int)i, v2);
+		}
 		return v;
 	
 	case TYPE_DICT:
@@ -368,8 +382,9 @@
 			object *key, *val;
 			key = r_object(p);
 			if (key == NULL)
-				break;
+				break; /* XXXX and how about memory errors? */
 			val = r_object(p);
+			/* XXXX error check? */
 			dict2insert(v, key, val);
 			DECREF(key);
 			XDECREF(val);
@@ -381,12 +396,20 @@
 			int argcount = r_short(p);
 			int nlocals = r_short(p);
 			int flags = r_short(p);
-			object *code = r_object(p);
-			object *consts = r_object(p);
-			object *names = r_object(p);
-			object *varnames = r_object(p);
-			object *filename = r_object(p);
-			object *name = r_object(p);
+			object *code = NULL;
+			object *consts = NULL;
+			object *names = NULL;
+			object *varnames = NULL;
+			object *filename = NULL;
+			object *name = NULL;
+			
+			code = r_object(p);
+			if (code) consts = r_object(p);
+			if (consts) names = r_object(p);
+			if (names) varnames = r_object(p);
+			if (varnames) filename = r_object(p);
+			if (filename) name = r_object(p);
+			
 			if (!err_occurred()) {
 				v = (object *) newcodeobject(
 					argcount, nlocals, flags,