Made a bit more robust against out-of-memory situations
This commit is contained in:
parent
10d0f8fc40
commit
9513f2c95a
|
@ -280,7 +280,7 @@ static object *
|
||||||
r_object(p)
|
r_object(p)
|
||||||
RFILE *p;
|
RFILE *p;
|
||||||
{
|
{
|
||||||
object *v;
|
object *v, *v2;
|
||||||
long i, n;
|
long i, n;
|
||||||
int type = r_byte(p);
|
int type = r_byte(p);
|
||||||
|
|
||||||
|
@ -347,8 +347,15 @@ r_object(p)
|
||||||
v = newtupleobject((int)n);
|
v = newtupleobject((int)n);
|
||||||
if (v == NULL)
|
if (v == NULL)
|
||||||
return v;
|
return v;
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++) {
|
||||||
SETTUPLEITEM(v, (int)i, r_object(p));
|
v2 = r_object(p);
|
||||||
|
if ( v2 == NULL ) {
|
||||||
|
DECREF(v);
|
||||||
|
v = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SETTUPLEITEM(v, (int)i, v2);
|
||||||
|
}
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
case TYPE_LIST:
|
case TYPE_LIST:
|
||||||
|
@ -356,8 +363,15 @@ r_object(p)
|
||||||
v = newlistobject((int)n);
|
v = newlistobject((int)n);
|
||||||
if (v == NULL)
|
if (v == NULL)
|
||||||
return v;
|
return v;
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++) {
|
||||||
setlistitem(v, (int)i, r_object(p));
|
v2 = r_object(p);
|
||||||
|
if ( v2 == NULL ) {
|
||||||
|
DECREF(v);
|
||||||
|
v = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
setlistitem(v, (int)i, v2);
|
||||||
|
}
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
case TYPE_DICT:
|
case TYPE_DICT:
|
||||||
|
@ -368,8 +382,9 @@ r_object(p)
|
||||||
object *key, *val;
|
object *key, *val;
|
||||||
key = r_object(p);
|
key = r_object(p);
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
break;
|
break; /* XXXX and how about memory errors? */
|
||||||
val = r_object(p);
|
val = r_object(p);
|
||||||
|
/* XXXX error check? */
|
||||||
dict2insert(v, key, val);
|
dict2insert(v, key, val);
|
||||||
DECREF(key);
|
DECREF(key);
|
||||||
XDECREF(val);
|
XDECREF(val);
|
||||||
|
@ -381,12 +396,20 @@ r_object(p)
|
||||||
int argcount = r_short(p);
|
int argcount = r_short(p);
|
||||||
int nlocals = r_short(p);
|
int nlocals = r_short(p);
|
||||||
int flags = r_short(p);
|
int flags = r_short(p);
|
||||||
object *code = r_object(p);
|
object *code = NULL;
|
||||||
object *consts = r_object(p);
|
object *consts = NULL;
|
||||||
object *names = r_object(p);
|
object *names = NULL;
|
||||||
object *varnames = r_object(p);
|
object *varnames = NULL;
|
||||||
object *filename = r_object(p);
|
object *filename = NULL;
|
||||||
object *name = r_object(p);
|
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()) {
|
if (!err_occurred()) {
|
||||||
v = (object *) newcodeobject(
|
v = (object *) newcodeobject(
|
||||||
argcount, nlocals, flags,
|
argcount, nlocals, flags,
|
||||||
|
|
Loading…
Reference in New Issue