[pypy-commit] cffi default: Windows passes test_c.

arigo noreply at buildbot.pypy.org
Sat Jun 16 10:46:41 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r386:a38f28171585
Date: 2012-06-16 10:46 +0200
http://bitbucket.org/cffi/cffi/changeset/a38f28171585/

Log:	Windows passes test_c.

diff --git a/c/_ffi_backend.c b/c/_ffi_backend.c
--- a/c/_ffi_backend.c
+++ b/c/_ffi_backend.c
@@ -1853,12 +1853,14 @@
     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)
 {
-    if (dlobj->dl_name == NULL)
-        return PyString_FromString("<clibrary stdlib>");
-    else
-        return PyString_FromFormat("<clibrary '%s'>", dlobj->dl_name);
+    return PyString_FromFormat("<clibrary '%s'>", get_dl_name(dlobj));
 }
 
 static PyObject *dl_load_function(DynLibObject *dlobj, PyObject *args)
@@ -1879,7 +1881,7 @@
     funcptr = dlsym(dlobj->dl_handle, funcname);
     if (funcptr == NULL) {
         PyErr_Format(PyExc_KeyError, "function '%s' not found in library '%s'",
-                     funcname, dlobj->dl_name);
+                     funcname, get_dl_name(dlobj));
         return NULL;
     }
 
@@ -1899,7 +1901,7 @@
     data = dlsym(dlobj->dl_handle, varname);
     if (data == NULL) {
         PyErr_Format(PyExc_KeyError, "variable '%s' not found in library '%s'",
-                     varname, dlobj->dl_name);
+                     varname, get_dl_name(dlobj));
         return NULL;
     }
     return convert_to_object(data, ct);
@@ -1919,7 +1921,7 @@
     data = dlsym(dlobj->dl_handle, varname);
     if (data == NULL) {
         PyErr_Format(PyExc_KeyError, "variable '%s' not found in library '%s'",
-                     varname, dlobj->dl_name);
+                     varname, get_dl_name(dlobj));
         return NULL;
     }
     if (convert_from_object(data, ct, value) < 0)
@@ -1973,17 +1975,15 @@
     void *handle;
     DynLibObject *dlobj;
 
-    if (!PyArg_ParseTuple(args, "et:load_library",
-                          Py_FileSystemDefaultEncoding, &filename)) {
-        if (PyTuple_Size(args) == 1 && PyTuple_GetItem(args, 0) == Py_None) {
-            PyErr_Clear();
-            handle = RTLD_DEFAULT;
-            filename = NULL;
-        }
-        else
-            return NULL;
+    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);
@@ -2216,7 +2216,11 @@
                 PyErr_SetString(PyExc_ValueError, "negative array length");
             return NULL;
         }
+#ifdef MS_WIN32
+        sprintf(extra_text, "[%ld]", (long)length);  /* XXX not large enough */
+#else
         sprintf(extra_text, "[%zd]", length);
+#endif
         arraysize = length * ctitem->ct_size;
         if (length > 0 && (arraysize / length) != ctitem->ct_size) {
             PyErr_SetString(PyExc_OverflowError,
diff --git a/c/misc_win32.h b/c/misc_win32.h
--- a/c/misc_win32.h
+++ b/c/misc_win32.h
@@ -72,18 +72,26 @@
 {
     if (handle == RTLD_DEFAULT) {
         static const char *standard_dlls[] = {
-            "kernel32.dll",
-            "user32.dll",
-            "gdi32.dll",
+            "MSVCR110",  /* XXX! */
+            "MSVCR100",
+            "MSVCR90",
+            "MSVCR80",
+
+            "KERNEL32",
+            "USER32",
+            "GDI32",
             NULL
         };
         const char **p;
         void *result;
 
         for (p = standard_dlls; *p != NULL; p++) {
-            result = GetProcAddress(GetModuleHandle(*p), symbol);
-            if (result)
-                return result;
+            HMODULE h = GetModuleHandle(*p);
+            if (h) {
+                result = GetProcAddress(h, symbol);
+                if (result)
+                    return result;
+            }
         }
         return NULL;
     }
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -25,7 +25,7 @@
 
 def test_load_library():
     x = load_library(None)
-    assert repr(x) == '<clibrary stdlib>'
+    assert repr(x) == "<clibrary '<stdlib>'>"
 
 def test_nonstandard_integer_types():
     d = nonstandard_integer_types()
@@ -623,12 +623,16 @@
     assert strlen("foobarbaz") == 9
 
 def test_read_variable():
+    if sys.platform == 'win32':
+        py.test.skip("untested")
     BVoidP = new_pointer_type(new_void_type())
     ll = load_library(None)
     stderr = ll.read_variable(BVoidP, "stderr")
     assert stderr == cast(BVoidP, _testfunc(8))
 
 def test_write_variable():
+    if sys.platform == 'win32':
+        py.test.skip("untested")
     BVoidP = new_pointer_type(new_void_type())
     ll = load_library(None)
     stderr = ll.read_variable(BVoidP, "stderr")


More information about the pypy-commit mailing list