Author: Armin Rigo <ar...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit