[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