Ulrich Eckhardt wrote:
Hi!
I'm looking at trunk/Python/sysmodule.c, function PySys_SetArgv(). In that
function, there is code like this:
PyObject* path = PySys_GetObject("path");
...
if (path != NULL) {
...
}
My intuition says that if path==NULL, something is very wrong. At least I
would expect to get 'None', but never NULL, except when out of memory. So,
for the case that path==NULL', I would simply invoke Py_FatalError("no mem
for sys.path"), similarly to the other call there.
Sounds reasonable?
Uli
Maybe it's just being safe?
From Python/sysmodule.c:
PyThreadState *tstate = PyThreadState_GET();
PyObject *sd = tstate->interp->sysdict;
if (sd == NULL)
return NULL;
return PyDict_GetItemString(sd, name);
So if tstate->interp->sysdict is NULL, we return NULL. That's probably a
bit unlikely.
However, PyDict_GetItemString attempts to allocate a new PyString from
the given char* key. If that fails, PySys_GetObject will also return
NULL -- just like most functions in the code base that hit an out of
memory error:
PyObject *
PyDict_GetItemString(PyObject *v, const char *key)
{
PyObject *kv, *rv;
kv = PyString_FromString(key);
if (kv == NULL)
return NULL;
rv = PyDict_GetItem(v, kv);
Py_DECREF(kv);
return rv;
}
Seems perfectly reasonable for it to return NULL in this situation.
Cheers,
T
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com