[pypy-commit] cffi cpy-extension: Move the code around.

arigo noreply at buildbot.pypy.org
Tue Jun 12 15:02:45 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: cpy-extension
Changeset: r287:7aa01dcb8332
Date: 2012-06-12 15:02 +0200
http://bitbucket.org/cffi/cffi/changeset/7aa01dcb8332/

Log:	Move the code around.

diff --git a/cffi/model.py b/cffi/model.py
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -26,9 +26,6 @@
         except KeyError:
             return self.new_backend_type(ffi, *args)
 
-    #def generate_cpy_typedef(self, verifier, name, step):
-    #    XXX
-
 
 class VoidType(BaseType):
     _attrs_ = ()
@@ -80,63 +77,6 @@
     def new_backend_type(self, ffi, result, *args):
         return ffi._backend.new_function_type(args, result, self.ellipsis)
 
-    def generate_cpy_function_decl(self, verifier, name):
-        prnt = verifier.prnt
-        numargs = len(self.args)
-        if numargs == 0:
-            argname = 'no_arg'
-        elif numargs == 1:
-            argname = 'arg0'
-        else:
-            argname = 'args'
-        prnt('static PyObject *_cffi_f_%s(PyObject *self, PyObject *%s)' %
-             (name, argname))
-        prnt('{')
-        assert not self.ellipsis  # XXX later
-        #
-        for i, type in enumerate(self.args):
-            prnt('  %s;' % type.get_c_name(' x%d;' % i))
-        if not isinstance(self.result, VoidType):
-            result_code = 'result = '
-            prnt('  %s;' % self.result.get_c_name(' result'))
-        else:
-            result_code = ''
-        #
-        if len(self.args) > 1:
-            rng = range(len(self.args))
-            for i in rng:
-                prnt('  PyObject *arg%d;' % i)
-            prnt()
-            prnt('  if (!PyArg_ParseTuple("%s:%s", %s)) {' % (
-                'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng])))
-            prnt('    return NULL;')
-        prnt()
-        #
-        for i in range(len(self.args)):
-            prnt('  x%d = PyFloat_AsDouble(arg%d);' % (i, i))
-            prnt('  if (x%d == -1.0 && PyErr_Occurred())' % i)
-            prnt('    return NULL;')
-            prnt()
-        #
-        prnt('  { %s%s(%s); }' % (
-            result_code, name,
-            ', '.join(['x%d' % i for i in range(len(self.args))])))
-        prnt()
-        #
-        prnt('  return PyFloat_FromDouble(result);')
-        prnt('}')
-        prnt()
-
-    def generate_cpy_function_method(self, verifier, name):
-        numargs = len(self.args)
-        if numargs == 0:
-            meth = 'METH_NOARGS'
-        elif numargs == 1:
-            meth = 'METH_O'
-        else:
-            meth = 'METH_VARARGS'
-        verifier.prnt('  {"%s", _cffi_f_%s, %s},' % (name, name, meth))
-
 
 class PointerType(BaseType):
     _attrs_ = ('totype',)
diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -1,5 +1,5 @@
 import os
-from . import ffiplatform
+from . import model, ffiplatform
 
 class Verifier(object):
 
@@ -16,13 +16,6 @@
 ##            print >> self.f, '  printf("%s\\n", %s);' % (
 ##                what, ', '.join(args))
 
-    def generate(self, step_name):
-        for name, tp in self.ffi._parser._declarations.iteritems():
-            kind, realname = name.split(' ', 1)
-            method = getattr(tp, 'generate_cpy_%s_%s' % (kind, step_name), 0)
-            if method:
-                method(self, realname)
-
     def verify(self, preamble, **kwargs):
         modname = ffiplatform.undercffi_module_name()
         filebase = os.path.join(ffiplatform.tmpdir(), modname)
@@ -65,3 +58,89 @@
             return imp.load_dynamic(modname, '%s.so' % filebase)
         except ImportError, e:
             raise ffiplatform.VerificationError(str(e))
+
+    def generate(self, step_name):
+        for name, tp in self.ffi._parser._declarations.iteritems():
+            kind, realname = name.split(' ', 1)
+            method = getattr(self, 'generate_cpy_%s_%s' % (kind, step_name))
+            method(tp, realname)
+
+    def generate_nothing(self, tp, name):
+        pass
+
+    def convert_to_c(self, tp, fromvar, tovar, errcode):
+        self.prnt('  %s = PyFloat_AsDouble(%s);' % (tovar, fromvar))
+
+    def get_converter_from_c(self, tp):
+        return 'PyFloat_FromDouble'
+
+    # ----------
+
+    # XXX
+    generate_cpy_typedef_decl   = generate_nothing
+    generate_cpy_typedef_method = generate_nothing
+    generate_cpy_typedef_init   = generate_nothing
+
+    # ----------
+
+    def generate_cpy_function_decl(self, tp, name):
+        assert isinstance(tp, model.FunctionType)
+        prnt = self.prnt
+        numargs = len(tp.args)
+        if numargs == 0:
+            argname = 'no_arg'
+        elif numargs == 1:
+            argname = 'arg0'
+        else:
+            argname = 'args'
+        prnt('static PyObject *_cffi_f_%s(PyObject *self, PyObject *%s)' %
+             (name, argname))
+        prnt('{')
+        assert not tp.ellipsis  # XXX later
+        #
+        for i, type in enumerate(tp.args):
+            prnt('  %s;' % type.get_c_name(' x%d' % i))
+        if not isinstance(tp.result, model.VoidType):
+            result_code = 'result = '
+            prnt('  %s;' % tp.result.get_c_name(' result'))
+        else:
+            result_code = ''
+        #
+        if len(tp.args) > 1:
+            rng = range(len(tp.args))
+            for i in rng:
+                prnt('  PyObject *arg%d;' % i)
+            prnt()
+            prnt('  if (!PyArg_ParseTuple("%s:%s", %s)) {' % (
+                'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng])))
+            prnt('    return NULL;')
+        prnt()
+        #
+        for i, type in enumerate(tp.args):
+            self.convert_to_c(type, 'arg%d' % i, 'x%d' % i, 'return NULL')
+            prnt()
+        #
+        prnt('  { %s%s(%s); }' % (
+            result_code, name,
+            ', '.join(['x%d' % i for i in range(len(tp.args))])))
+        prnt()
+        #
+        if result_code:
+            prnt('  return %s(result);' % self.get_converter_from_c(tp.result))
+        else:
+            prnt('  Py_INCREF(Py_None);')
+            prnt('  return Py_None;')
+        prnt('}')
+        prnt()
+
+    def generate_cpy_function_method(self, tp, name):
+        numargs = len(tp.args)
+        if numargs == 0:
+            meth = 'METH_NOARGS'
+        elif numargs == 1:
+            meth = 'METH_O'
+        else:
+            meth = 'METH_VARARGS'
+        self.prnt('  {"%s", _cffi_f_%s, %s},' % (name, name, meth))
+
+    generate_cpy_function_init = generate_nothing


More information about the pypy-commit mailing list