[pypy-commit] creflect default: still in-progress
arigo
noreply at buildbot.pypy.org
Sun Nov 30 23:08:42 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r130:47d913cc3830
Date: 2014-11-30 23:09 +0100
http://bitbucket.org/cffi/creflect/changeset/47d913cc3830/
Log: still in-progress
diff --git a/creflect/codegen.py b/creflect/codegen.py
--- a/creflect/codegen.py
+++ b/creflect/codegen.py
@@ -32,12 +32,16 @@
def _get_next_name(self, prefix):
return '%s%d' % (prefix, len(self.crx_type_vars) + 1)
- def write_crx_type_var(self, expr):
+ def write_crx_type_var(self, expr, is_qualtype=False):
if expr in self.crx_type_cache:
return self.crx_type_cache[expr]
#
- t1 = self._get_next_name('t')
- self.crx_type_vars.append('*%s' % t1)
+ if not is_qualtype:
+ t1 = 't%d' % (len(self.crx_type_vars) + 1)
+ self.crx_type_vars.append('*%s' % t1)
+ else:
+ t1 = 'q%d' % (len(self.crx_qualtype_vars) + 1)
+ self.crx_qualtype_vars.append('%s' % t1)
self.crx_type_cache[expr] = t1
self.writeline('%s = %s;' % (t1, expr))
return t1
diff --git a/creflect/creflect.h b/creflect/creflect.h
--- a/creflect/creflect.h
+++ b/creflect/creflect.h
@@ -66,7 +66,8 @@
size_t, size_t, _crx_field_t[], int);
void (*complete_enum)(_CRX_SELF, _crx_type_t *, _crx_type_t *);
void (*define_type)(_CRX_SELF, const char *, _crx_type_t *, int);
- void (*define_var)(_CRX_SELF, const char *, _crx_type_t *, int, void *);
+ void (*define_var)(_CRX_SELF, const char *, _crx_type_t *, int,
+ const void *);
void (*define_func)(_CRX_SELF, const char *, _crx_type_t *,
_crx_qual_type[], int, _crx_trampoline0_fn, void *);
void (*define_num_const)(_CRX_SELF, const char *, _crx_type_t *,
diff --git a/creflect/creflect_debug_print.c b/creflect/creflect_debug_print.c
--- a/creflect/creflect_debug_print.c
+++ b/creflect/creflect_debug_print.c
@@ -228,7 +228,7 @@
}
static void tst_define_var(_crx_builder_t *cb, const char *name,
- _crx_type_t *type, int qualifiers, void *addr)
+ _crx_type_t *type, int qualifiers, const void *addr)
{
printf("VAR %s: %s\n", name, show_qualtype2(type, qualifiers));
}
diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -15,14 +15,26 @@
if self.quals & CRX_VOLATILE:
replace_with = ('volatile ' + replace_with).rstrip()
#
- if replace_with == '' and ' &' in self.type.c_name_with_marker:
+ if (replace_with == '' or replace_with.startswith('[')) and (
+ ' &' in self.type.c_name_with_marker):
replace_from = ' &'
else:
replace_from = '&'
return self.type.c_name_with_marker.replace(replace_from, replace_with)
def inspect_qualtype(self, block, inspect):
- return self.type.inspect_type(block, inspect, self.quals)
+ t1, qualexpr = self.type.inspect_type(block, inspect, self.quals)
+ if self.quals & CRX_VOLATILE:
+ qualexpr.append('_CRX_VOLATILE')
+ if self.quals & CRX_CONST:
+ qualexpr.append('_CRX_CONST')
+ if len(qualexpr) == 0:
+ q1 = '0'
+ elif len(qualexpr) == 1:
+ q1 = qualexpr[0]
+ else:
+ q1 = '(%s)' % (' | '.join(qualexpr),)
+ return t1, q1
def as_func_arg(self):
if isinstance(self.type, ArrayType):
@@ -80,7 +92,7 @@
def inspect_type(self, block, inspect, qualifiers):
inspect.flush()
- return block.write_crx_type_var('cb->get_void_type(cb)')
+ return block.write_crx_type_var('cb->get_void_type(cb)'), []
void_type = VoidType()
@@ -170,10 +182,12 @@
raise AssertionError
else:
if isinstance(inspect, VarInspector):
- decl = self.get_c_name("*p1")
+ qualtype = QualType(self, qualifiers)
+ decl = qualtype.get_c_name("*p1")
block.writeline("%s = &%s; /* check that '%s' is of type '%s'"
" */" % (decl, inspect.varname,
- inspect.varname, self.get_c_name()))
+ inspect.varname,
+ qualtype.get_c_name()))
block.writeline("(void)p1;")
if self.is_signed_type():
expr = 'cb->get_signed_type(cb, sizeof(%s), "%s")' % (
@@ -188,7 +202,7 @@
self.name, self.name)
else:
raise AssertionError
- return block.write_crx_type_var(expr)
+ return block.write_crx_type_var(expr), []
def write_num_const_decl(self, block, varname):
block.writedecl("_crx_num_const_t v;")
@@ -240,12 +254,12 @@
def _get_arg_ret_types(self, block):
inspect = MissingInspector()
- t1 = self.result.inspect_type(block, inspect, 0)
+ t1, q1_ignored = self.result.inspect_type(block, inspect, 0)
a2 = block.write_crx_qualtype_var(len(self.args))
for i, arg in enumerate(self.args):
- t3 = arg.inspect_qualtype(block, inspect)
+ t3, q3 = arg.inspect_qualtype(block, inspect)
block.writeline('%s[%d].type = %s;' % (a2, i, t3))
- block.writeline('%s[%d].qualifiers = %d;' % (a2, i, arg.quals))
+ block.writeline('%s[%d].qualifiers = %s;' % (a2, i, q3))
return t1, a2
def _get_c_call_sequence(self, varname):
@@ -296,7 +310,7 @@
t1, a2 = self._get_arg_ret_types(block)
expr = 'cb->get_function_type(cb, %s, %s, %d, &%s)' % (
t1, a2, len(self.args), crx_func_name)
- return block.write_crx_type_var(expr)
+ return block.write_crx_type_var(expr), []
def inspect_type_ellipsis(self, block, inspect):
if isinstance(inspect, VarInspector):
@@ -308,7 +322,7 @@
t1, a2 = self._get_arg_ret_types(block)
expr = 'cb->get_ellipsis_function_type(cb, %s, %s, %d)' % (
t1, a2, len(self.args))
- return block.write_crx_type_var(expr)
+ return block.write_crx_type_var(expr), []
def shadow_global_var(self, top_level_block, fnname):
if self.ellipsis:
@@ -378,7 +392,7 @@
inspect.after_star_p1_assignment.append(after)
inspect.levels.append('*')
elif isinstance(inspect, VarInspector):
- if isinstance(self.totype, VoidType):
+ if isinstance(self.toqualtype.type, VoidType):
block.writeline("void *p1 = %s; /* check that '%s' is a"
" pointer */" % (inspect.varname,
inspect.varname))
@@ -387,15 +401,17 @@
" constant */" % (inspect.varname,
inspect.varname))
else:
- decl = self.get_c_name("*p1")
+ qualtype = QualType(self, qualifiers)
+ decl = qualtype.get_c_name("*p1")
block.writeline("%s = &%s; /* check that '%s' is of type '%s'"
" */" % (decl, inspect.varname,
- inspect.varname, self.get_c_name()))
+ inspect.varname,
+ qualtype.get_c_name()))
block.writeline("(void)p1;")
inspect = MissingInspector()
- t1 = self.toqualtype.inspect_qualtype(block, inspect)
- return block.write_crx_type_var('cb->get_pointer_type(cb, %s, %d)'
- % (t1, self.toqualtype.quals))
+ t1, q1 = self.toqualtype.inspect_qualtype(block, inspect)
+ return block.write_crx_type_var('cb->get_pointer_type(cb, %s, %s)'
+ % (t1, q1)), []
class ArrayType(BaseType):
@@ -429,22 +445,24 @@
inspect.levels.append('[]')
inspect.after_star_p1_assignment.append(after)
elif isinstance(inspect, VarInspector):
- declitem = self.item.get_c_name("(*p1)")
+ qualtype = QualType(self.item, qualifiers)
+ declitem = qualtype.get_c_name("(*p1)")
block.writeline("%s[] = &%s; /* check that '%s' is of type '%s'"
" */" % (declitem, inspect.varname,
- inspect.varname, self.get_c_name()))
+ inspect.varname,
+ qualtype.get_c_name('[]')))
block.writeline("(void)p1;")
star_p1 = inspect.varname
inspect = MissingInspector()
else:
star_p1 = None
- t1 = self.item.inspect_type(block, inspect, qualifiers)
+ t1, q1 = self.item.inspect_type(block, inspect, qualifiers)
if star_p1 is not None:
expr = 'cb->get_array_type(cb, %s, sizeof(%s) / sizeof(*%s))' % (
t1, star_p1, star_p1)
else:
expr = 'cb->get_incomplete_array_type(cb, %s)' % (t1,)
- return block.write_crx_type_var(expr)
+ return block.write_crx_type_var(expr), []
class StructOrUnionOrEnum(BaseType):
@@ -463,7 +481,7 @@
def inspect_type(self, block, inspect, qualifiers):
inspect.flush()
- return self.get_type_var(block)
+ return self.get_type_var(block), []
class UserType(BaseType):
@@ -476,13 +494,15 @@
def inspect_type(self, block, inspect, qualifiers):
inspect.flush()
if isinstance(inspect, VarInspector):
- decl = self.get_c_name("*p1")
+ qualtype = QualType(self, qualifiers)
+ decl = qualtype.get_c_name("*p1")
block.writeline("%s = &%s; /* check that '%s' is of type '%s'"
" */" % (decl, inspect.varname,
- inspect.varname, self.get_c_name()))
+ inspect.varname, qualtype.get_c_name()))
block.writeline("(void)p1;")
- return block.write_crx_type_var('cb->get_user_type(cb, "%s")' % (
- self.name,))
+ qt1 = block.write_crx_type_var('cb->get_user_type(cb, "%s")' % (
+ self.name,), is_qualtype=True)
+ return '%s.type' % qt1, ['%s.qualifiers' % qt1]
class UnknownType(BaseType):
@@ -495,7 +515,7 @@
def inspect_type(self, block, inspect, qualifiers):
inspect.flush()
return block.write_crx_type_var('cb->get_unknown_type(cb, "%s")' % (
- self.approx_name,))
+ self.approx_name,)), []
# ____________________________________________________________
@@ -680,11 +700,12 @@
o_decl = ("size_t o = ((char *)&((%s)0)->%s)"
" - (char *)0;%s" % (ptrtp, fldname, comment))
#
- t2 = fldtype.inspect_type(block, inspect)
+ t2, q2 = fldtype.inspect_type(block, inspect)
inspect.stop()
block.writedecl(o_decl)
block.writeline('%s[%d].name = "%s";' % (d1, i, fldname))
block.writeline('%s[%d].type = %s;' % (d1, i, t2))
+ block.writeline('%s[%d].qualifiers = %s;' % (d1, i, q2))
block.writeline('%s[%d].offset = o;' % (d1, i))
block.writeline('%s[%d].numbits = -1;' % (d1, i))
block.writeline('%s[%d].bitshift = -1;' % (d1, i))
@@ -703,10 +724,10 @@
def write_declaration(self, funcblock):
block = CodeBlock(funcblock)
inspect = TypeInspector(block, self.name)
- t1 = self.qualtype.inspect_qualtype(block, inspect)
+ t1, q1 = self.qualtype.inspect_qualtype(block, inspect)
inspect.stop()
- block.writeline('cb->define_type(cb, "%s", %s, %d);' % (
- self.name, t1, self.qualtype.quals))
+ block.writeline('cb->define_type(cb, "%s", %s, %s);' % (
+ self.name, t1, q1))
funcblock.write_subblock(block)
@@ -718,11 +739,11 @@
def write_declaration(self, funcblock):
block = CodeBlock(funcblock)
inspect = VarInspector(block, self.name)
- t1 = self.qualtype.inspect_qualtype(block, inspect)
+ t1, q1 = self.qualtype.inspect_qualtype(block, inspect)
shadow = self.qualtype.type.shadow_global_var(block.crx_top_level,
self.name)
- block.writeline('cb->define_var(cb, "%s", %s, %d, &%s);' % (
- self.name, t1, self.qualtype.quals, shadow))
+ block.writeline('cb->define_var(cb, "%s", %s, %s, &%s);' % (
+ self.name, t1, q1, shadow))
funcblock.write_subblock(block)
@@ -738,9 +759,9 @@
class ConstDecl(VarDecl):
def write_declaration(self, funcblock):
- if isinstance(self.type, PrimitiveType):
+ if isinstance(self.qualtype.type, PrimitiveType):
block = CodeBlock(funcblock)
- self.type.write_num_const_decl(block, self.name)
+ self.qualtype.type.write_num_const_decl(block, self.name)
funcblock.write_subblock(block)
else:
VarDecl.write_declaration(self, funcblock)
diff --git a/creflect/test/codegen/002c.c b/creflect/test/codegen/002c.c
--- a/creflect/test/codegen/002c.c
+++ b/creflect/test/codegen/002c.c
@@ -11,7 +11,7 @@
p1 = (void *)&p2;
*p1 = (void *)0; /* check that 'num_t' is a pointer type */
t1 = cb->get_void_type(cb);
- t2 = cb->get_pointer_type(cb, t1, 1);
+ t2 = cb->get_pointer_type(cb, t1, _CRX_CONST);
cb->define_type(cb, "num_t", t2, 0);
#expect TYPEDEF num_t = PTR CONST void
}
diff --git a/creflect/test/codegen/002d.c b/creflect/test/codegen/002d.c
--- a/creflect/test/codegen/002d.c
+++ b/creflect/test/codegen/002d.c
@@ -16,7 +16,7 @@
}
t1 = cb->get_void_type(cb);
t2 = cb->get_pointer_type(cb, t1, 0);
- cb->define_type(cb, "num_t", t2, 1);
+ cb->define_type(cb, "num_t", t2, _CRX_CONST);
#expect TYPEDEF num_t = CONST PTR void
}
}
diff --git a/creflect/test/codegen/002e.c b/creflect/test/codegen/002e.c
new file mode 100644
--- /dev/null
+++ b/creflect/test/codegen/002e.c
@@ -0,0 +1,18 @@
+typedef volatile const void *num_t;
+
+# ____________________________________________________________
+
+void test002e(_crx_builder_t *cb)
+{
+ _crx_type_t *t1, *t2;
+ {
+ num_t *p1;
+ char *p2;
+ p1 = (void *)&p2;
+ *p1 = (void *)0; /* check that 'num_t' is a pointer type */
+ t1 = cb->get_void_type(cb);
+ t2 = cb->get_pointer_type(cb, t1, (_CRX_VOLATILE | _CRX_CONST));
+ cb->define_type(cb, "num_t", t2, 0);
+#expect TYPEDEF num_t = PTR VOLATILE CONST void
+ }
+}
diff --git a/creflect/test/codegen/006.c b/creflect/test/codegen/006.c
--- a/creflect/test/codegen/006.c
+++ b/creflect/test/codegen/006.c
@@ -12,7 +12,7 @@
p1 = (void *)b;
(void)(*p1 << 1); /* check that 'num_t' is an integer type */
t1 = _CRX_INT_TYPE(cb, *p1, "int");
- cb->define_type(cb, "num_t", t1, 1);
+ cb->define_type(cb, "num_t", t1, _CRX_CONST);
#expect TYPEDEF num_t = CONST unsigned int
}
}
diff --git a/creflect/test/codegen/006b.c b/creflect/test/codegen/006b.c
--- a/creflect/test/codegen/006b.c
+++ b/creflect/test/codegen/006b.c
@@ -19,7 +19,7 @@
**p1 = -1; /* check that '*num_t' is not declared 'const' */
t1 = _CRX_INT_TYPE(cb, **p1, "int");
t2 = cb->get_pointer_type(cb, t1, 0);
- cb->define_type(cb, "num_t", t2, 1);
+ cb->define_type(cb, "num_t", t2, _CRX_CONST);
#expect TYPEDEF num_t = CONST PTR int
}
}
diff --git a/creflect/test/codegen/006c.c b/creflect/test/codegen/006c.c
--- a/creflect/test/codegen/006c.c
+++ b/creflect/test/codegen/006c.c
@@ -24,7 +24,7 @@
t1 = _CRX_INT_TYPE(cb, ***p1, "int");
t2 = cb->get_array_type(cb, t1, sizeof(**p1) / sizeof(***p1));
t3 = cb->get_pointer_type(cb, t2, 0);
- cb->define_type(cb, "foo_t", t3, 1);
+ cb->define_type(cb, "foo_t", t3, _CRX_CONST);
#expect TYPEDEF foo_t = CONST PTR ARRAY[27] int
}
}
diff --git a/creflect/test/codegen/func-005.c b/creflect/test/codegen/func-005.c
--- a/creflect/test/codegen/func-005.c
+++ b/creflect/test/codegen/func-005.c
@@ -29,7 +29,7 @@
t2 = cb->get_signed_type(cb, sizeof(int), "int");
t3 = cb->get_incomplete_array_type(cb, t2);
a1[0].type = t3;
- a1[0].qualifiers = 1;
+ a1[0].qualifiers = _CRX_CONST;
t4 = cb->get_signed_type(cb, sizeof(long), "long");
t5 = cb->get_char_type(cb);
a2[0].type = t5;
diff --git a/creflect/test/codegen/glob-004.c b/creflect/test/codegen/glob-004.c
--- a/creflect/test/codegen/glob-004.c
+++ b/creflect/test/codegen/glob-004.c
@@ -9,17 +9,20 @@
void testglob_004(_crx_builder_t *cb)
{
- _crx_type_t *t1, *t2, *a3[2], *t4, *t5;
+ _crx_type_t *t1, *t2, *t3, *t4;
+ _crx_qual_type a1[2];
{
int (**p1)(long, long) = &someglob; /* check that 'someglob' is of type 'int (*)(long, long)' */
(void)p1;
t1 = cb->get_signed_type(cb, sizeof(int), "int");
t2 = cb->get_signed_type(cb, sizeof(long), "long");
- a3[0] = t2;
- a3[1] = t2;
- t4 = cb->get_function_type(cb, t1, a3, 2, &testglob_004__f1);
- t5 = cb->get_pointer_type(cb, t4, 0);
- cb->define_var(cb, "someglob", t5, 0, &someglob);
+ a1[0].type = t2;
+ a1[0].qualifiers = 0;
+ a1[1].type = t2;
+ a1[1].qualifiers = 0;
+ t3 = cb->get_function_type(cb, t1, a1, 2, &testglob_004__f1);
+ t4 = cb->get_pointer_type(cb, t3, 0);
+ cb->define_var(cb, "someglob", t4, 0, &someglob);
#expect VAR someglob: PTR FUNC( long -> long -> int )
}
}
diff --git a/creflect/test/codegen/glob-005.c b/creflect/test/codegen/glob-005.c
--- a/creflect/test/codegen/glob-005.c
+++ b/creflect/test/codegen/glob-005.c
@@ -6,7 +6,8 @@
void testglob_005(_crx_builder_t *cb)
{
- _crx_type_t *t1, *t2, *t3;
+ _crx_type_t *t1, *t2;
+ _crx_qual_type q1;
{
mytype_t *p1;
char *p2;
@@ -19,10 +20,9 @@
}
{
mytype_t *p1 = &foobar; /* check that 'foobar' is of type 'mytype_t' */
- int q1 = 0;
(void)p1;
- t3 = cb->get_user_type(cb, "mytype_t", &q1);
- cb->define_var(cb, "foobar", t3, q1, &foobar);
+ q1 = cb->get_user_type(cb, "mytype_t");
+ cb->define_var(cb, "foobar", q1.type, q1.qualifiers, &foobar);
#expect VAR foobar: mytype_t
}
}
diff --git a/creflect/test/codegen/glob-005b.c b/creflect/test/codegen/glob-005b.c
new file mode 100644
--- /dev/null
+++ b/creflect/test/codegen/glob-005b.c
@@ -0,0 +1,28 @@
+typedef void *mytype_t;
+
+const mytype_t foobar;
+
+# ____________________________________________________________
+
+void testglob_005b(_crx_builder_t *cb)
+{
+ _crx_type_t *t1, *t2;
+ _crx_qual_type q1;
+ {
+ mytype_t *p1;
+ char *p2;
+ p1 = (void *)&p2;
+ *p1 = (void *)0; /* check that 'mytype_t' is a pointer type */
+ t1 = cb->get_void_type(cb);
+ t2 = cb->get_pointer_type(cb, t1, 0);
+ cb->define_type(cb, "mytype_t", t2, 0);
+#expect TYPEDEF mytype_t = PTR void
+ }
+ {
+ mytype_t const *p1 = &foobar; /* check that 'foobar' is of type 'mytype_t const' */
+ (void)p1;
+ q1 = cb->get_user_type(cb, "mytype_t");
+ cb->define_var(cb, "foobar", q1.type, (q1.qualifiers | _CRX_CONST), &foobar);
+#expect VAR foobar: CONST mytype_t
+ }
+}
More information about the pypy-commit
mailing list