[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