]> granicus.if.org Git - python/commitdiff
Two fixes to find_class:
authorJeremy Hylton <jeremy@alum.mit.edu>
Tue, 11 Aug 1998 19:52:51 +0000 (19:52 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Tue, 11 Aug 1998 19:52:51 +0000 (19:52 +0000)
1. Only DECREF the class's module when the module is retrieved via
PyImport_Import.  If it is retrieved from the modules dictionary with
PyDict_GetItem, it is using a borrowed reference.

2. If the module doesn't define the desired class, raise the same
SystemError that pickle.py does instead of returning an AttributeError
(which is cryptic at best).

Also, fix the PyArg_ParseTuple in cpm_loads (the externally visible
loads) function:  Use "S" instead of "O" because cStringIO will croak
with a "bad arguments to internal function" if passed anything other
than a string.

Modules/cPickle.c

index f6e43eefbe587533a9f1c8b526dab64db32aa6a3..3bb0c1f586b31360e74520205ed4bb15785bd813 100644 (file)
@@ -1935,15 +1935,28 @@ static PyObject *
 find_class(PyObject *py_module_name, PyObject *py_global_name) {
     PyObject *global = 0, *module;
 
-    UNLESS(module=PySys_GetObject("modules")) return NULL;
-    UNLESS(module=PyDict_GetItem(module, py_module_name)) {
-      PyErr_Clear();
-      UNLESS(module=PyImport_Import(py_module_name)) return NULL;
-    }
-
-    global=PyObject_GetAttr(module, py_global_name);
-    Py_DECREF(module);
+    module = PySys_GetObject("modules");
+    if (module == NULL)
+       return NULL;
 
+    module = PyDict_GetItem(module, py_module_name);
+    if (module == NULL) {
+       module = PyImport_Import(py_module_name);
+       if (!module)
+           return NULL;
+       global = PyObject_GetAttr(module, py_global_name);
+       Py_DECREF(module);
+    }
+    else
+       global = PyObject_GetAttr(module, py_global_name);
+    if (global == NULL) {
+       char buf[256 + 37];
+       sprintf(buf, "Failed to import class %.128s from moduile %.128s",
+               PyString_AS_STRING(py_global_name),
+               PyString_AS_STRING(py_module_name));  
+       PyErr_SetString(PyExc_SystemError, buf);
+       return NULL;
+    }
     return global;
 }
 
@@ -4093,7 +4106,7 @@ cpm_loads(PyObject *self, PyObject *args) {
     PyObject *ob, *file = 0, *res = NULL;
     Unpicklerobject *unpickler = 0;
 
-    UNLESS(PyArg_ParseTuple(args, "O", &ob))
+    UNLESS(PyArg_ParseTuple(args, "S", &ob))
         goto finally;
 
     UNLESS(file = PycStringIO->NewInput(ob))