[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