[pypy-commit] cffi cffi-1.0: Clean up

arigo noreply at buildbot.pypy.org
Sat May 16 11:21:33 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: cffi-1.0
Changeset: r2008:6a28083d8beb
Date: 2015-05-16 11:22 +0200
http://bitbucket.org/cffi/cffi/changeset/6a28083d8beb/

Log:	Clean up

diff --git a/cffi/api.py b/cffi/api.py
--- a/cffi/api.py
+++ b/cffi/api.py
@@ -481,8 +481,7 @@
                              "per ffi object")
         if not isinstance(module_name, basestring):
             raise TypeError("'module_name' must be a string")
-        self._recompiler_module_name = str(module_name)
-        self._assigned_source = (source, kwds)
+        self._assigned_source = (source, kwds, str(module_name))
 
     def distutils_extension(self, tmpdir='build', verbose=True):
         from distutils.dir_util import mkpath
@@ -493,13 +492,13 @@
                 return self.verifier.get_extension()
             raise ValueError("set_source() must be called before"
                              " distutils_extension()")
-        source, kwds = self._assigned_source
+        source, kwds, module_name = self._assigned_source
         if source is None:
             raise TypeError("distutils_extension() is only for C extension "
                             "modules, not for dlopen()-style pure Python "
                             "modules")
         mkpath(tmpdir)
-        ext, updated = recompile(self, self._recompiler_module_name,
+        ext, updated = recompile(self, module_name,
                                  source, tmpdir=tmpdir,
                                  call_c_compiler=False, **kwds)
         if verbose:
@@ -514,11 +513,11 @@
         #
         if not hasattr(self, '_assigned_source'):
             raise ValueError("set_source() must be called before emit_c_code()")
-        source, kwds = self._assigned_source
+        source, kwds, module_name = self._assigned_source
         if source is None:
             raise TypeError("emit_c_code() is only for C extension modules, "
                             "not for dlopen()-style pure Python modules")
-        recompile(self, self._recompiler_module_name, source,
+        recompile(self, module_name, source,
                   c_file=filename, call_c_compiler=False, **kwds)
 
     def emit_python_code(self, filename):
@@ -526,11 +525,11 @@
         #
         if not hasattr(self, '_assigned_source'):
             raise ValueError("set_source() must be called before emit_c_code()")
-        source, kwds = self._assigned_source
+        source, kwds, module_name = self._assigned_source
         if source is not None:
             raise TypeError("emit_python_code() is only for dlopen()-style "
                             "pure Python modules, not for C extension modules")
-        recompile(self, self._recompiler_module_name, source,
+        recompile(self, module_name, source,
                   c_file=filename, call_c_compiler=False, **kwds)
 
     def compile(self, tmpdir='.'):
@@ -538,8 +537,8 @@
         #
         if not hasattr(self, '_assigned_source'):
             raise ValueError("set_source() must be called before compile()")
-        source, kwds = self._assigned_source
-        return recompile(self, self._recompiler_module_name,
+        source, kwds, module_name = self._assigned_source
+        return recompile(self, module_name,
                          source, tmpdir=tmpdir, **kwds)
 
 
diff --git a/cffi/recompiler.py b/cffi/recompiler.py
--- a/cffi/recompiler.py
+++ b/cffi/recompiler.py
@@ -332,11 +332,19 @@
         if self.ffi._included_ffis:
             prnt('static const char * const _cffi_includes[] = {')
             for ffi_to_include in self.ffi._included_ffis:
-                if not hasattr(ffi_to_include, '_recompiler_module_name'):
+                try:
+                    included_source, _, included_module_name = (
+                        ffi_to_include._assigned_source)
+                except AttributeError:
                     raise ffiplatform.VerificationError(
-                        "this ffi includes %r, but the latter has not been "
-                        "compiled yet" % (ffi_to_include,))
-                prnt('  "%s",' % (ffi_to_include._recompiler_module_name,))
+                        "ffi object %r includes %r, but the latter has not "
+                        "been prepared with set_source()" % (
+                            self.ffi, ffi_to_include,))
+                if included_source is None:
+                    raise ffiplatform.VerificationError(
+                        "not implemented yet: ffi.include() of a Python-based "
+                        "ffi inside a C-based ffi")
+                prnt('  "%s",' % (included_module_name,))
             prnt('  NULL')
             prnt('};')
             prnt()
@@ -396,7 +404,6 @@
             self.module_name,))
         prnt('}')
         prnt('#endif')
-        self.ffi._recompiler_module_name = self.module_name
 
     def _to_py(self, x):
         if isinstance(x, str):
@@ -422,12 +429,19 @@
         num_includes = len(self.ffi._included_ffis or ())
         for i in range(num_includes):
             ffi_to_include = self.ffi._included_ffis[i]
-            if not hasattr(ffi_to_include, '_recompiler_module_name'):
+            try:
+                included_source, _, included_module_name = (
+                    ffi_to_include._assigned_source)
+            except AttributeError:
                 raise ffiplatform.VerificationError(
-                    "this ffi includes %r, but the latter has not been "
-                    "compiled yet" % (ffi_to_include,))
-            prnt('from %s import ffi as _ffi%d' % (
-                ffi_to_include._recompiler_module_name, i))
+                    "ffi object %r includes %r, but the latter has not "
+                    "been prepared with set_source()" % (
+                        self.ffi, ffi_to_include,))
+            if included_source is not None:
+                raise ffiplatform.VerificationError(
+                    "not implemented yet: ffi.include() of a C-based "
+                    "ffi inside a Python-based ffi")
+            prnt('from %s import ffi as _ffi%d' % (included_module_name, i))
         prnt()
         prnt("ffi = _cffi_backend.FFI(%s," % (self._to_py(self.module_name),))
         #
@@ -450,7 +464,6 @@
         #
         # the footer
         prnt(')')
-        self.ffi._recompiler_module_name = self.module_name
 
     # ----------
 
diff --git a/testing/cffi1/test_dlopen.py b/testing/cffi1/test_dlopen.py
--- a/testing/cffi1/test_dlopen.py
+++ b/testing/cffi1/test_dlopen.py
@@ -86,6 +86,7 @@
 def test_include():
     ffi = FFI()
     ffi.cdef("#define ABC 123")
+    ffi.set_source('test_include', None)
     target = udir.join('test_include.py')
     assert make_py_source(ffi, 'test_include', str(target))
     assert target.read() == r"""# auto-generated file
diff --git a/testing/cffi1/test_new_ffi_1.py b/testing/cffi1/test_new_ffi_1.py
--- a/testing/cffi1/test_new_ffi_1.py
+++ b/testing/cffi1/test_new_ffi_1.py
@@ -85,6 +85,7 @@
 
     ffi1.cdef(DEFS)
     ffi1.cdef(DEFS_PACKED, packed=True)
+    ffi1.set_source("test_new_ffi_1", CCODE)
 
     outputfilename = recompile(ffi1, "test_new_ffi_1", CCODE,
                                tmpdir=str(udir))
@@ -1514,7 +1515,6 @@
         assert foo2.b == 30
 
     def test_include_struct_union_enum_typedef(self):
-        #py.test.xfail("ffi.include")
         ffi1, CCODE = construction_params
         ffi2 = cffi.FFI()
         ffi2.include(ffi1)
diff --git a/testing/cffi1/test_recompiler.py b/testing/cffi1/test_recompiler.py
--- a/testing/cffi1/test_recompiler.py
+++ b/testing/cffi1/test_recompiler.py
@@ -16,9 +16,11 @@
     recomp.collect_type_table()
     assert ''.join(map(str, recomp.cffi_types)) == expected_output
 
-def verify(ffi, module_name, *args, **kwds):
+def verify(ffi, module_name, source, *args, **kwds):
     kwds.setdefault('undef_macros', ['NDEBUG'])
-    return recompiler._verify(ffi, '_CFFI_' + module_name, *args, **kwds)
+    module_name = '_CFFI_' + module_name
+    ffi.set_source(module_name, source)
+    return recompiler._verify(ffi, module_name, source, *args, **kwds)
 
 
 def test_type_table_func():
diff --git a/testing/cffi1/test_verify1.py b/testing/cffi1/test_verify1.py
--- a/testing/cffi1/test_verify1.py
+++ b/testing/cffi1/test_verify1.py
@@ -28,9 +28,15 @@
     _verify_counter = 0
 
     def verify(self, preamble='', *args, **kwds):
+        # HACK to reuse the tests from ../cffi0/test_verify.py
         FFI._verify_counter += 1
-        return recompiler._verify(self, 'verify%d' % FFI._verify_counter,
-                                  preamble, *args,
+        module_name = 'verify%d' % FFI._verify_counter
+        try:
+            del self._assigned_source
+        except AttributeError:
+            pass
+        self.set_source(module_name, preamble)
+        return recompiler._verify(self, module_name, preamble, *args,
                                   extra_compile_args=self._extra_compile_args,
                                   **kwds)
 


More information about the pypy-commit mailing list