when is path==NULL?
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 -- Sator Laser GmbH Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932 ************************************************************************************** Visit our website at <http://www.satorlaser.de/> ************************************************************************************** Diese E-Mail einschließlich sämtlicher Anhänge ist nur für den Adressaten bestimmt und kann vertrauliche Informationen enthalten. Bitte benachrichtigen Sie den Absender umgehend, falls Sie nicht der beabsichtigte Empfänger sein sollten. Die E-Mail ist in diesem Fall zu löschen und darf weder gelesen, weitergeleitet, veröffentlicht oder anderweitig benutzt werden. E-Mails können durch Dritte gelesen werden und Viren sowie nichtautorisierte Änderungen enthalten. Sator Laser GmbH ist für diese Folgen nicht verantwortlich. **************************************************************************************
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
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
I also meant to mention that there might be a reason why we want the out of memory error to bubble up to the caller should that happen while attempting to allocate the PyString in PyDict_GetItemString, rather than just bailing out with a generic FatalError. Cheers, T
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.
PySys_GetObject may return NULL after the user has removed sys.path with delattr(sys, 'path'). There are valid applications for removing sys.path. Christian
On Tue, Sep 30, 2008 at 5:48 AM, Christian Heimes <lists@cheimes.de> wrote:
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.
PySys_GetObject may return NULL after the user has removed sys.path with delattr(sys, 'path'). There are valid applications for removing sys.path.
Or before sys.path is initialized using PySys_SetPath(). Trust me, this code is as it should be. -- --Guido van Rossum (home page: http://www.python.org/~guido/)
participants (4)
-
Christian Heimes
-
Guido van Rossum
-
Thomas Lee
-
Ulrich Eckhardt