Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r62:3216c4cab225
Date: 2014-11-18 00:40 +0100
http://bitbucket.org/cffi/creflect/changeset/3216c4cab225/

Log:    in-progress

diff --git a/creflect/cparser.py b/creflect/cparser.py
--- a/creflect/cparser.py
+++ b/creflect/cparser.py
@@ -95,9 +95,9 @@
         if isinstance(node, pycparser.c_ast.FuncDecl):
             tp = self._get_type(node)
             assert isinstance(tp, model.FunctionType)
-            tp = model.PointerType(tp)
-            self._declare('function ' + decl.name, tp)
+            self.declarations.append(model.VarDecl(decl.name, tp))
         else:
+            xxxxxxxxxxxxxx
             const = 'const' in decl.quals
             if isinstance(node, pycparser.c_ast.Struct):
                 if node.decls is not None:
diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -157,13 +157,20 @@
         # limitations so far:
         assert not self.ellipsis, "XXX"
         assert inspect is not None, "XXX"
-        assert inspect.levels == ['*'], "XXX"
+        if inspect.started:
+            assert inspect.levels == ['*'], "XXX"
+
+        if inspect.started:
+            localvar = 'f'
+        else:
+            assert inspect.varname is not None
+            localvar = inspect.varname
 
         t1 = self.result.inspect_type(block, None)
         call = ['    ']
         if not isinstance(self.result, VoidType):
             call.append('*(%s)result = ' % (self.result.get_c_name('*'),))
-        call.append('f(')
+        call.append('%s(' % localvar)
         t_args = [arg.inspect_type(block, None) for arg in self.args]
         a2 = block.add_array_crx_types(len(t_args))
         for i, t in enumerate(t_args):
@@ -174,12 +181,17 @@
         call.append(');')
         #
         toplevel = block.crx_top_level
-        crx_func_name = '%s__%s' % (toplevel.crx_func_name,
-                                    block._get_next_name('f'))
+        if inspect.varname is not None:
+            extraname = 'c_' + inspect.varname
+        else:
+            extraname = block._get_next_name('f')
+        crx_func_name = '%s__%s' % (toplevel.crx_func_name, extraname)
         wrline = toplevel.writeline
         wrline('static void %s(void *func, void *args[], void *result) {' % (
             crx_func_name,))
-        wrline('    %s f = func;' % inspect.typename)
+        if inspect.started:
+            assert inspect.levels == ['*']
+            wrline('    %s %s = func;' % (inspect.typename, localvar))
         wrline(''.join(call))
         wrline('}')
         wrline('')
@@ -288,9 +300,10 @@
 
 
 class TypeInspector(object):
-    def __init__(self, block, typename, structfield=None):
+    def __init__(self, block, typename, structfield=None, varname=None):
         self.block = block
         self.typename = typename
+        self.varname = varname
         self.structfield = structfield
         self.started = False
         if structfield is None:
@@ -466,3 +479,17 @@
         inspect.stop()
         block.writeline('cb->define_type(cb, "%s", %s);' % (self.name, t1))
         funcblock.write_subblock(block)
+
+
+class VarDecl(object):
+    def __init__(self, name, type):
+        self.name = name
+        self.type = type
+
+    def write_declaration(self, funcblock):
+        block = CodeBlock(funcblock)
+        inspect = TypeInspector(block, None, varname=self.name)
+        t1 = self.type.inspect_type(block, inspect)
+        inspect.stop()
+        block.writeline('cb->define_var(cb, "%s", %s, &xxx);' % (self.name, 
t1))
+        funcblock.write_subblock(block)
diff --git a/test/codegen/func-001.c b/test/codegen/func-001.c
--- a/test/codegen/func-001.c
+++ b/test/codegen/func-001.c
@@ -6,21 +6,21 @@
 
 # ____________________________________________________________
 
-static void __creflect_t2(void *func, void *args[], void *result) {
-    int(*f)(void) = func;
+static void testfunc_001__c_f(void *func, void *args[], void *result) {
     *(int *)result = f();
 }
 
-static int __creflect_d_f(void) {
+static int testfunc_001__d_f(void) {
     return f();
 }
 
 void testfunc_001(crx_builder_t *cb)
 {
-    crx_type *t1, *t2;
+    crx_type_t *t1, *t2;
     {
         t1 = cb->get_signed_type(cb, sizeof(int), "int");
-        t2 = cb->get_function_type(cb, t1, 0, 0, &__creflect_t2);
-        cb->define_var(cb, "f", t2, &__creflect_d_f);
+        t2 = cb->get_function_type(cb, t1, 0, 0, &testfunc_001__c_f);
+        cb->define_var(cb, "f", t2, &testfunc_001__d_f);
+#expect VAR f: FUNC( int )
     }
 }
diff --git a/test/test_codegen.py b/test/test_codegen.py
--- a/test/test_codegen.py
+++ b/test/test_codegen.py
@@ -33,7 +33,11 @@
         cdefblock.append(line)
     else:
         raise ValueError("marker '# _____' not found in %r" % (filename,))
-    expected = [line.rstrip('\n') for line in f]
+    expected = []
+    for line in f:
+        expected.append(line.rstrip('\n'))
+        if line.startswith('# _____'):
+            del expected[:]
     f.close()
     print
     #
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to