[pypy-commit] pypy cffi-1.0: Trying it out

arigo noreply at buildbot.pypy.org
Sun May 10 14:05:07 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: cffi-1.0
Changeset: r77273:8a302d41bd2b
Date: 2015-05-10 14:04 +0200
http://bitbucket.org/pypy/pypy/changeset/8a302d41bd2b/

Log:	Trying it out

diff --git a/lib_pypy/_gdbm_build.py b/lib_pypy/_gdbm_build.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_gdbm_build.py
@@ -0,0 +1,65 @@
+import cffi, os, sys
+
+ffi = cffi.FFI()
+ffi.cdef('''
+#define GDBM_READER ...
+#define GDBM_WRITER ...
+#define GDBM_WRCREAT ...
+#define GDBM_NEWDB ...
+#define GDBM_FAST ...
+#define GDBM_SYNC ...
+#define GDBM_NOLOCK ...
+#define GDBM_REPLACE ...
+
+void* gdbm_open(char *, int, int, int, void (*)());
+void gdbm_close(void*);
+
+typedef struct {
+    char *dptr;
+    int   dsize;
+} datum;
+
+datum gdbm_fetch(void*, datum);
+datum pygdbm_fetch(void*, char*, int);
+int gdbm_delete(void*, datum);
+int gdbm_store(void*, datum, datum, int);
+int gdbm_exists(void*, datum);
+int pygdbm_exists(void*, char*, int);
+
+int gdbm_reorganize(void*);
+
+datum gdbm_firstkey(void*);
+datum gdbm_nextkey(void*, datum);
+void gdbm_sync(void*);
+
+char* gdbm_strerror(int);
+int gdbm_errno;
+
+void free(void*);
+''')
+
+
+kwds = {}
+if sys.platform.startswith('freebsd'):
+    _localbase = os.environ.get('LOCALBASE', '/usr/local')
+    kwds['include_dirs'] = [os.path.join(_localbase, 'include')]
+    kwds['library_dirs'] = [os.path.join(_localbase, 'lib')]
+
+ffi.set_source("_gdbm_cffi", '''
+#include <stdlib.h>
+#include "gdbm.h"
+
+static datum pygdbm_fetch(GDBM_FILE gdbm_file, char *dptr, int dsize) {
+    datum key = {dptr, dsize};
+    return gdbm_fetch(gdbm_file, key);
+}
+
+static int pygdbm_exists(GDBM_FILE gdbm_file, char *dptr, int dsize) {
+    datum key = {dptr, dsize};
+    return gdbm_exists(gdbm_file, key);
+}
+''', libraries=['gdbm'], **kwds)
+
+
+if __name__ == '__main__':
+    ffi.compile()
diff --git a/lib_pypy/gdbm.py b/lib_pypy/gdbm.py
--- a/lib_pypy/gdbm.py
+++ b/lib_pypy/gdbm.py
@@ -1,76 +1,7 @@
-import cffi, os, sys
-import thread
+from _gdbm_cffi import ffi, lib    # generated by _gdbm_build.py
+import os, thread
 _lock = thread.allocate_lock()
 
-ffi = cffi.FFI()
-ffi.cdef('''
-#define GDBM_READER ...
-#define GDBM_WRITER ...
-#define GDBM_WRCREAT ...
-#define GDBM_NEWDB ...
-#define GDBM_FAST ...
-#define GDBM_SYNC ...
-#define GDBM_NOLOCK ...
-#define GDBM_REPLACE ...
-
-void* gdbm_open(char *, int, int, int, void (*)());
-void gdbm_close(void*);
-
-typedef struct {
-    char *dptr;
-    int   dsize;
-} datum;
-
-datum gdbm_fetch(void*, datum);
-datum pygdbm_fetch(void*, char*, int);
-int gdbm_delete(void*, datum);
-int gdbm_store(void*, datum, datum, int);
-int gdbm_exists(void*, datum);
-int pygdbm_exists(void*, char*, int);
-
-int gdbm_reorganize(void*);
-
-datum gdbm_firstkey(void*);
-datum gdbm_nextkey(void*, datum);
-void gdbm_sync(void*);
-
-char* gdbm_strerror(int);
-int gdbm_errno;
-
-void free(void*);
-''')
-
-try:
-    verify_code = '''
-    #include <stdlib.h>
-    #include "gdbm.h"
-
-    static datum pygdbm_fetch(GDBM_FILE gdbm_file, char *dptr, int dsize) {
-        datum key = {dptr, dsize};
-        return gdbm_fetch(gdbm_file, key);
-    }
-
-    static int pygdbm_exists(GDBM_FILE gdbm_file, char *dptr, int dsize) {
-        datum key = {dptr, dsize};
-        return gdbm_exists(gdbm_file, key);
-    }
-    
-    '''
-    if sys.platform.startswith('freebsd'):
-        import os.path
-        _localbase = os.environ.get('LOCALBASE', '/usr/local')
-        lib = ffi.verify(verify_code, libraries=['gdbm'],
-             include_dirs=[os.path.join(_localbase, 'include')],
-             library_dirs=[os.path.join(_localbase, 'lib')]
-        )
-    else:
-        lib = ffi.verify(verify_code, libraries=['gdbm'])
-except cffi.VerificationError as e:
-    # distutils does not preserve the actual message,
-    # but the verification is simple enough that the
-    # failure must be due to missing gdbm dev libs
-    raise ImportError('%s: %s' %(e.__class__.__name__, e))
-
 class error(Exception):
     pass
 


More information about the pypy-commit mailing list