]> granicus.if.org Git - python/commitdiff
Provide a dummy empty directory as f_builtins instead of failing, when
authorGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:09:46 +0000 (02:09 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:09:46 +0000 (02:09 +0000)
no valid directory is passed in.  This prevents __del__ to fail when
invoked after __builtins__ has already been discarded.

Also add PyFrame_Fini() to discard the cache of frames.

Objects/frameobject.c

index 26f54f86f8edfce5f7e7aa9a2ef8d1470aba250b..295b613fe745a6ca13d94dcf971fd2df8cf4c4b8 100644 (file)
@@ -167,11 +167,8 @@ PyFrame_New(tstate, code, globals, locals)
        builtins = PyDict_GetItem(globals, builtin_object);
        if (builtins != NULL && PyModule_Check(builtins))
                builtins = PyModule_GetDict(builtins);
-       if (builtins == NULL || !PyDict_Check(builtins)) {
-               PyErr_SetString(PyExc_TypeError,
-                               "bad __builtins__ dictionary");
-               return NULL;
-       }
+       if (builtins != NULL && !PyDict_Check(builtins))
+               builtins = NULL;
        if (free_list == NULL) {
                f = (PyFrameObject *)
                        malloc(sizeof(PyFrameObject) +
@@ -195,12 +192,18 @@ PyFrame_New(tstate, code, globals, locals)
                f->ob_type = &PyFrame_Type;
                _Py_NewReference(f);
        }
+       if (builtins == NULL) {
+               builtins = PyDict_New();
+               if (builtins == NULL)
+                       return NULL;
+       }
+       else
+               Py_XINCREF(builtins);
+       f->f_builtins = builtins;
        Py_XINCREF(back);
        f->f_back = back;
        Py_INCREF(code);
        f->f_code = code;
-       Py_XINCREF(builtins);
-       f->f_builtins = builtins;
        Py_INCREF(globals);
        f->f_globals = globals;
        if (code->co_flags & CO_NEWLOCALS) {
@@ -352,3 +355,15 @@ PyFrame_LocalsToFast(f, clear)
        }
        PyErr_Restore(error_type, error_value, error_traceback);
 }
+
+/* Clear out the free list */
+
+void
+PyFrame_Fini()
+{
+       while (free_list != NULL) {
+               PyFrameObject *f = free_list;
+               free_list = free_list->f_back;
+               PyMem_DEL(f);
+       }
+}