[pypy-commit] creflect default: progress

arigo noreply at buildbot.pypy.org
Tue Nov 18 16:16:51 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r69:91c5dbd9cca3
Date: 2014-11-18 16:17 +0100
http://bitbucket.org/cffi/creflect/changeset/91c5dbd9cca3/

Log:	progress

diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -95,20 +95,7 @@
         return self.ALL_PRIMITIVE_TYPES[self.name] == 'f'
 
     def inspect_nonconst_type(self, block, inspect):
-        if not isinstance(inspect, TypeInspector):
-            if self.is_signed_type():
-                expr = 'cb->get_signed_type(cb, sizeof(%s), "%s")' % (
-                    self.name, self.name)
-            elif self.is_unsigned_type():
-                expr = 'cb->get_unsigned_type(cb, sizeof(%s), "%s")' % (
-                    self.name, self.name)
-            elif self.is_char_type():
-                expr = 'cb->get_char_type(cb)'
-            elif self.is_float_type():
-                xxx
-            else:
-                raise AssertionError
-        else:
+        if isinstance(inspect, TypeInspector):
             star_p1 = inspect.fetch_star_p1()
             comment1 = inspect.get_comment(0, False, "a valid type", minlevel=1)
             comment2 = inspect.get_comment(0, False, "an integer type")
@@ -128,6 +115,25 @@
                 xxx
             else:
                 raise AssertionError
+        else:
+            if isinstance(inspect, VarInspector):
+                decl = self.get_c_name("*p1")
+                block.writeline("%s = &%s;  /* check that '%s' is of type '%s'"
+                                " */" % (decl, inspect.varname,
+                                         inspect.varname, self.get_c_name()))
+                block.writeline("(void)p1;")
+            if self.is_signed_type():
+                expr = 'cb->get_signed_type(cb, sizeof(%s), "%s")' % (
+                    self.name, self.name)
+            elif self.is_unsigned_type():
+                expr = 'cb->get_unsigned_type(cb, sizeof(%s), "%s")' % (
+                    self.name, self.name)
+            elif self.is_char_type():
+                expr = 'cb->get_char_type(cb)'
+            elif self.is_float_type():
+                xxx
+            else:
+                raise AssertionError
         return block.write_crx_type_var(expr)
 
 
@@ -277,11 +283,21 @@
                 inspect.after_star_p1_assignment.append(after)
             inspect.levels.append('*')
         elif isinstance(inspect, VarInspector):
-            block.writeline("void *p1 = %s;  /* check that '%s' is a"
-                            " pointer */" % (inspect.varname, inspect.varname))
-            block.writeline("if (0) { %s = p1; }  /* check that '%s' is a"
-                            " pointer variable, and not an array or a"
-                            " constant */" % (inspect.varname, inspect.varname))
+            if isinstance(self.totype, VoidType):
+                block.writeline("void *p1 = %s;  /* check that '%s' is a"
+                                " pointer */" % (inspect.varname,
+                                                 inspect.varname))
+                block.writeline("if (0) { %s = p1; }  /* check that '%s' is a"
+                                " pointer variable, and not an array or a"
+                                " constant */" % (inspect.varname,
+                                                  inspect.varname))
+            else:
+                decl = self.totype.get_c_name("**p1")
+                block.writeline("%s = &%s;  /* check that '%s' is of type '%s'"
+                                " */" % (decl, inspect.varname,
+                                         inspect.varname, self.get_c_name()))
+                block.writeline("(void)p1;")
+            inspect = MissingInspector()
         t1 = self.totype.inspect_type(block, inspect)
         return block.write_crx_type_var('cb->get_pointer_type(cb, %s)' % t1)
 
@@ -332,6 +348,7 @@
                                      inspect.varname, self.get_c_name()))
             block.writeline("(void)p1;")
             star_p1 = inspect.varname
+            inspect = MissingInspector()
         else:
             star_p1 = None
         t1 = self.item.inspect_type(block, inspect)
diff --git a/test/codegen/glob-002c.c b/test/codegen/glob-002c.c
new file mode 100644
--- /dev/null
+++ b/test/codegen/glob-002c.c
@@ -0,0 +1,17 @@
+int someglob;
+
+// XXX can be improved to correct the size of the integer type
+
+# ____________________________________________________________
+
+void testglob_002c(crx_builder_t *cb)
+{
+    crx_type_t *t1;
+    {
+        int *p1 = &someglob;  /* check that 'someglob' is of type 'int' */
+        (void)p1;
+        t1 = cb->get_signed_type(cb, sizeof(int), "int");
+        cb->define_var(cb, "someglob", t1, &someglob);
+#expect VAR someglob: int
+    }
+}
diff --git a/test/codegen/glob-002d.c b/test/codegen/glob-002d.c
new file mode 100644
--- /dev/null
+++ b/test/codegen/glob-002d.c
@@ -0,0 +1,16 @@
+int *someglob;
+
+# ____________________________________________________________
+
+void testglob_002d(crx_builder_t *cb)
+{
+    crx_type_t *t1, *t2;
+    {
+        int **p1 = &someglob;  /* check that 'someglob' is of type 'int *' */
+        (void)p1;
+        t1 = cb->get_signed_type(cb, sizeof(int), "int");
+        t2 = cb->get_pointer_type(cb, t1);
+        cb->define_var(cb, "someglob", t2, &someglob);
+#expect VAR someglob: PTR int
+    }
+}


More information about the pypy-commit mailing list