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