[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