[pypy-commit] cffi default: Attempting to collect export_symbols correctly, as needed for Windows
arigo
noreply at buildbot.pypy.org
Sat Aug 11 20:37:39 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r796:3a8e50bbdb3c
Date: 2012-08-11 20:37 +0200
http://bitbucket.org/cffi/cffi/changeset/3a8e50bbdb3c/
Log: Attempting to collect export_symbols correctly, as needed for
Windows
diff --git a/cffi/vengine_cpy.py b/cffi/vengine_cpy.py
--- a/cffi/vengine_cpy.py
+++ b/cffi/vengine_cpy.py
@@ -10,6 +10,9 @@
self.verifier = verifier
self.ffi = verifier.ffi
+ def patch_extension_kwds(self, kwds):
+ pass
+
def collect_types(self):
self._typesdict = {}
self._generate("collecttype")
diff --git a/cffi/vengine_gen.py b/cffi/vengine_gen.py
--- a/cffi/vengine_gen.py
+++ b/cffi/vengine_gen.py
@@ -9,6 +9,13 @@
def __init__(self, verifier):
self.verifier = verifier
self.ffi = verifier.ffi
+ self.export_symbols = []
+
+ def patch_extension_kwds(self, kwds):
+ # add 'export_symbols' to the dictionary. Note that we add the
+ # list before filling it. When we fill it, it will thus also show
+ # up in kwds['export_symbols'].
+ kwds.setdefault('export_symbols', self.export_symbols)
def collect_types(self):
pass # not needed in the generic engine
@@ -98,7 +105,9 @@
arglist = [type.get_c_name(' %s' % arg)
for type, arg in zip(tp.args, argnames)]
arglist = ', '.join(arglist) or 'void'
- funcdecl = ' _cffi_f_%s(%s)' % (name, arglist)
+ wrappername = '_cffi_f_%s' % name
+ self.export_symbols.append(wrappername)
+ funcdecl = ' %s(%s)' % (wrappername, arglist)
prnt(tp.result.get_c_name(funcdecl))
prnt('{')
#
@@ -180,6 +189,7 @@
prnt(' { %s = &p->%s; (void)tmp; }' % (
ftype.get_c_name('(*tmp)'), fname))
prnt('}')
+ self.export_symbols.append(layoutfuncname)
prnt('ssize_t %s(ssize_t i)' % (layoutfuncname,))
prnt('{')
prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname)
@@ -274,6 +284,7 @@
def _generate_gen_const(self, is_int, name, tp=None, category='const'):
prnt = self._prnt
funcname = '_cffi_%s_%s' % (category, name)
+ self.export_symbols.append(funcname)
if is_int:
assert category == 'const'
prnt('int %s(long long *out_value)' % funcname)
@@ -330,6 +341,7 @@
return
#
funcname = '_cffi_enum_%s' % name
+ self.export_symbols.append(funcname)
prnt = self._prnt
prnt('int %s(char *out_error)' % funcname)
prnt('{')
@@ -418,8 +430,12 @@
cffimod_header = r'''
#include <stdio.h>
#include <stddef.h>
-#include <stdint.h>
#include <stdarg.h>
#include <errno.h>
-#include <sys/types.h> /* XXX for ssize_t */
+#ifdef _WIN32
+# include <Windows.h>
+#else
+# include <stdint.h>
+# include <sys/types.h> /* XXX for ssize_t */
+#endif
'''
diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -9,9 +9,10 @@
def __init__(self, ffi, preamble, force_generic_engine=False, **kwds):
self.ffi = ffi
self.preamble = preamble
- self.kwds = kwds
vengine_class = _locate_engine_class(ffi, force_generic_engine)
self._vengine = vengine_class(self)
+ self._vengine.patch_extension_kwds(kwds)
+ self.kwds = kwds
#
key = '\x00'.join(['1', sys.version[:3], __version__, preamble] +
ffi._cdefsources)
More information about the pypy-commit
mailing list