[pypy-commit] cffi default: Simplify code, after realizing that the front-end never calls

arigo noreply at buildbot.pypy.org
Sat Jun 16 11:00:43 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r387:6b57fdfe7659
Date: 2012-06-16 11:00 +0200
http://bitbucket.org/cffi/cffi/changeset/6b57fdfe7659/

Log:	Simplify code, after realizing that the front-end never calls the
	backend's load_library() with None.

diff --git a/c/_ffi_backend.c b/c/_ffi_backend.c
--- a/c/_ffi_backend.c
+++ b/c/_ffi_backend.c
@@ -1847,20 +1847,14 @@
 
 static void dl_dealloc(DynLibObject *dlobj)
 {
-    if (dlobj->dl_handle != RTLD_DEFAULT)
-        dlclose(dlobj->dl_handle);
+    dlclose(dlobj->dl_handle);
     free(dlobj->dl_name);
     PyObject_Del(dlobj);
 }
 
-static const char *get_dl_name(DynLibObject *dlobj)
-{
-    return dlobj->dl_name ? dlobj->dl_name : "<stdlib>";
-}
-
 static PyObject *dl_repr(DynLibObject *dlobj)
 {
-    return PyString_FromFormat("<clibrary '%s'>", get_dl_name(dlobj));
+    return PyString_FromFormat("<clibrary '%s'>", dlobj->dl_name);
 }
 
 static PyObject *dl_load_function(DynLibObject *dlobj, PyObject *args)
@@ -1881,7 +1875,7 @@
     funcptr = dlsym(dlobj->dl_handle, funcname);
     if (funcptr == NULL) {
         PyErr_Format(PyExc_KeyError, "function '%s' not found in library '%s'",
-                     funcname, get_dl_name(dlobj));
+                     funcname, dlobj->dl_name);
         return NULL;
     }
 
@@ -1901,7 +1895,7 @@
     data = dlsym(dlobj->dl_handle, varname);
     if (data == NULL) {
         PyErr_Format(PyExc_KeyError, "variable '%s' not found in library '%s'",
-                     varname, get_dl_name(dlobj));
+                     varname, dlobj->dl_name);
         return NULL;
     }
     return convert_to_object(data, ct);
@@ -1921,7 +1915,7 @@
     data = dlsym(dlobj->dl_handle, varname);
     if (data == NULL) {
         PyErr_Format(PyExc_KeyError, "variable '%s' not found in library '%s'",
-                     varname, get_dl_name(dlobj));
+                     varname, dlobj->dl_name);
         return NULL;
     }
     if (convert_from_object(data, ct, value) < 0)
@@ -1975,32 +1969,23 @@
     void *handle;
     DynLibObject *dlobj;
 
-    if (PyTuple_Size(args) == 1 && PyTuple_GetItem(args, 0) == Py_None) {
-        handle = RTLD_DEFAULT;
-        filename = NULL;
-    }
-    else {
-        if (!PyArg_ParseTuple(args, "et:load_library",
-                              Py_FileSystemDefaultEncoding, &filename))
-            return NULL;
-
-        handle = dlopen(filename, RTLD_LAZY);
-        if (handle == NULL) {
-            PyErr_Format(PyExc_OSError, "cannot load library: %s", filename);
-            return NULL;
-        }
-        filename = strdup(filename);
+    if (!PyArg_ParseTuple(args, "et:load_library",
+                          Py_FileSystemDefaultEncoding, &filename))
+        return NULL;
+
+    handle = dlopen(filename, RTLD_LAZY);
+    if (handle == NULL) {
+        PyErr_Format(PyExc_OSError, "cannot load library: %s", filename);
+        return NULL;
     }
 
     dlobj = PyObject_New(DynLibObject, &dl_type);
     if (dlobj == NULL) {
-        if (handle != RTLD_DEFAULT)
-            dlclose(handle);
-        free(filename);
+        dlclose(handle);
         return NULL;
     }
     dlobj->dl_handle = handle;
-    dlobj->dl_name = filename;
+    dlobj->dl_name = strdup(filename);
     return (PyObject *)dlobj;
 }
 
diff --git a/c/misc_win32.h b/c/misc_win32.h
--- a/c/misc_win32.h
+++ b/c/misc_win32.h
@@ -60,8 +60,7 @@
 /************************************************************/
 /* Emulate dlopen()&co. from the Windows API */
 
-#define RTLD_DEFAULT   NULL
-#define RTLD_LAZY      0
+#define RTLD_LAZY  0
 
 static void *dlopen(const char *filename, int flag)
 {
@@ -70,34 +69,7 @@
 
 static void *dlsym(void *handle, const char *symbol)
 {
-    if (handle == RTLD_DEFAULT) {
-        static const char *standard_dlls[] = {
-            "MSVCR110",  /* XXX! */
-            "MSVCR100",
-            "MSVCR90",
-            "MSVCR80",
-
-            "KERNEL32",
-            "USER32",
-            "GDI32",
-            NULL
-        };
-        const char **p;
-        void *result;
-
-        for (p = standard_dlls; *p != NULL; p++) {
-            HMODULE h = GetModuleHandle(*p);
-            if (h) {
-                result = GetProcAddress(h, symbol);
-                if (result)
-                    return result;
-            }
-        }
-        return NULL;
-    }
-    else {
-        return GetProcAddress((HMODULE)handle, symbol);
-    }
+    return GetProcAddress((HMODULE)handle, symbol);
 }
 
 static void dlclose(void *handle)
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -23,9 +23,14 @@
     return sizeof(BPtr)
 
 
+def find_and_load_library(name):
+    import ctypes.util
+    path = ctypes.util.find_library(name)
+    return load_library(path)
+
 def test_load_library():
-    x = load_library(None)
-    assert repr(x) == "<clibrary '<stdlib>'>"
+    x = find_and_load_library('c')
+    assert repr(x).startswith("<clibrary '")
 
 def test_nonstandard_integer_types():
     d = nonstandard_integer_types()
@@ -615,7 +620,7 @@
     BCharP = new_pointer_type(BChar)
     BLong = new_primitive_type("long")
     BFunc = new_function_type((BCharP,), BLong, False)
-    ll = load_library(None)
+    ll = find_and_load_library('c')
     strlen = ll.load_function(BFunc, "strlen")
     input = newp(new_array_type(BCharP, None), "foobar")
     assert strlen(input) == 6
@@ -626,7 +631,7 @@
     if sys.platform == 'win32':
         py.test.skip("untested")
     BVoidP = new_pointer_type(new_void_type())
-    ll = load_library(None)
+    ll = find_and_load_library('c')
     stderr = ll.read_variable(BVoidP, "stderr")
     assert stderr == cast(BVoidP, _testfunc(8))
 
@@ -634,7 +639,7 @@
     if sys.platform == 'win32':
         py.test.skip("untested")
     BVoidP = new_pointer_type(new_void_type())
-    ll = load_library(None)
+    ll = find_and_load_library('c')
     stderr = ll.read_variable(BVoidP, "stderr")
     ll.write_variable(BVoidP, "stderr", None)
     assert ll.read_variable(BVoidP, "stderr") is None
diff --git a/testing/test_ownlib.py b/testing/test_ownlib.py
--- a/testing/test_ownlib.py
+++ b/testing/test_ownlib.py
@@ -21,6 +21,8 @@
     Backend = CTypesBackend
 
     def setup_class(cls):
+        if sys.platform == 'win32':
+            return
         from testing.udir import udir
         udir.join('testownlib.c').write(SOURCE)
         subprocess.check_call(
@@ -29,6 +31,8 @@
         cls.module = str(udir.join('testownlib.so'))
 
     def test_getting_errno(self):
+        if sys.platform == 'win32':
+            py.test.skip("fix the auto-generation of the tiny test lib")
         ffi = FFI(backend=self.Backend())
         ffi.cdef("""
             int test_getting_errno(void);
@@ -39,6 +43,8 @@
         assert ffi.errno == 123
 
     def test_setting_errno(self):
+        if sys.platform == 'win32':
+            py.test.skip("fix the auto-generation of the tiny test lib")
         if self.Backend is CTypesBackend and '__pypy__' in sys.modules:
             py.test.skip("XXX errno issue with ctypes on pypy?")
         ffi = FFI(backend=self.Backend())


More information about the pypy-commit mailing list