[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