Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r983:aa47c6364769
Date: 2012-10-07 18:01 +0200
http://bitbucket.org/cffi/cffi/changeset/aa47c6364769/

Log:    Use dlerror() to report error conditions more precisely.

diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -2595,10 +2595,13 @@
                      ct->ct_name);
         return NULL;
     }
+    dlerror();   /* clear error condition */
     funcptr = dlsym(dlobj->dl_handle, funcname);
     if (funcptr == NULL) {
-        PyErr_Format(PyExc_KeyError, "function '%s' not found in library '%s'",
-                     funcname, dlobj->dl_name);
+        const char *error = dlerror();
+        PyErr_Format(PyExc_KeyError,
+                     "function '%s' not found in library '%s': %s",
+                     funcname, dlobj->dl_name, error);
         return NULL;
     }
 
@@ -2615,11 +2618,16 @@
                           &CTypeDescr_Type, &ct, &varname))
         return NULL;
 
+    dlerror();   /* clear error condition */
     data = dlsym(dlobj->dl_handle, varname);
     if (data == NULL) {
-        PyErr_Format(PyExc_KeyError, "variable '%s' not found in library '%s'",
-                     varname, dlobj->dl_name);
-        return NULL;
+        const char *error = dlerror();
+        if (error != NULL) {
+            PyErr_Format(PyExc_KeyError,
+                         "variable '%s' not found in library '%s': %s",
+                         varname, dlobj->dl_name, error);
+            return NULL;
+        }
     }
     return convert_to_object(data, ct);
 }
@@ -2635,10 +2643,13 @@
                           &CTypeDescr_Type, &ct, &varname, &value))
         return NULL;
 
+    dlerror();   /* clear error condition */
     data = dlsym(dlobj->dl_handle, varname);
     if (data == NULL) {
-        PyErr_Format(PyExc_KeyError, "variable '%s' not found in library '%s'",
-                     varname, dlobj->dl_name);
+        const char *error = dlerror();
+        PyErr_Format(PyExc_KeyError,
+                     "variable '%s' not found in library '%s': %s",
+                     varname, dlobj->dl_name, error);
         return NULL;
     }
     if (convert_from_object(data, ct, value) < 0)
@@ -2711,8 +2722,9 @@
     printable_filename = filename_or_null ? filename_or_null : "<None>";
     handle = dlopen(filename_or_null, flags);
     if (handle == NULL) {
+        const char *error = dlerror();
         PyErr_Format(PyExc_OSError, "cannot load library %s: %s",
-                     printable_filename, dlerror());
+                     printable_filename, error);
         return NULL;
     }
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to