Mercurial > cpython-lru_cache-weakref
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,
