Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r55:c0cc01d4d272
Date: 2014-11-17 22:36 +0100
http://bitbucket.org/cffi/creflect/changeset/c0cc01d4d272/

Log:    progress

diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -180,7 +180,9 @@
         self.c_name_with_marker = (
             self.item.c_name_with_marker.replace('&', brackets))
 
-    def inspect_nonconst_type(self, block, inspect):
+    def inspect_type(self, block, inspect):
+        # this class overrides inspect_type() instead of
+        # inspect_nonconst_type(), to avoid the extra call to get_const_type()
         star_p1 = inspect.fetch_star_p1()
         errmsg = "type '%s' is not an array, but a pointer type" % (
             inspect.get_comment_type(0, False),)
@@ -190,19 +192,17 @@
                 ampersand_star_p1 = ampersand_star_p1[2:]
             block.writeline("if ((void *)%s != (void *)%s) {" % (
                 ampersand_star_p1, star_p1))
-            block.writeline("    r = r0;")
-            block.sprintf(r"#error %s\n" % errmsg, indent=4)
-            block.tr.need_return_value()
-            block.writeline("    r1 = -1;")
-            block.writeline("    goto %s;" % block.get_skip_label())
+            block.writeline('    cb->error(cb, "%s");' % (errmsg,))
+            block.writeline("    return;")
             block.writeline("}")
         inspect.levels.append('[]')
         inspect.after_star_p1_assignment.append(after)
-        self.item.inspect_type(block, inspect)
-        block.sprintf_add_right('[%lld]',
-            extra='(long long)(sizeof(%s) / sizeof(*%s))' % (
-                star_p1, star_p1),
-            extralength=20)
+        t1 = self.item.inspect_type(block, inspect)
+        t2 = block.add_crx_type_var()
+        block.writeline('%s = cb->get_array_type(cb, %s, '
+                        'sizeof(%s) / sizeof(*%s));' % (
+            t2, t1, star_p1, star_p1))
+        return t2
 
 
 class StructOrUnionOrEnum(BaseType):
diff --git a/test/codegen/005c.c b/test/codegen/005c.c
--- a/test/codegen/005c.c
+++ b/test/codegen/005c.c
@@ -2,59 +2,25 @@
 
 # ____________________________________________________________
 
-int test005c(char *r)
+void test005c(crx_builder_t *cb)
 {
-    int r1 = 0;
-    if (!r)
-        return 58 + 8 + 18 + 38;
+    crx_type_t *t1, *t2, *t3;
     {
         foo_t *p1;
         char *p2;
         char b[sizeof(***p1)];  /* check that '(*foo_t)[]' is a valid type */
-        char *r0 = r;
         p1 = (void *)&p2;
         *p1 = (void *)b;    /* check that 'foo_t' is a pointer type */
         if ((void *)*p1 != (void *)**p1) {
-            r = r0;
-            r += sprintf(r, "#error type '*foo_t' is not an array, but a 
pointer type\n");
-            r1 = -1;
-            goto f2;
+            cb->error(cb, "type '*foo_t' is not an array, but a pointer type");
+            return;
         }
         (void)(***p1 << 1);  /* check that '(*foo_t)[]' is an integer type */
-        r += sprintf(r, "typedef ");
         ***p1 = -1;  /* check that '(*foo_t)[]' is not declared 'const' */
-        if (***p1 > 0) {
-            if (sizeof(***p1) == 1 && ***p1 == 1)
-                r += sprintf(r, "_Bool");
-            else if (sizeof(***p1) == sizeof(unsigned int))
-                r += sprintf(r, "unsigned int");
-            else if (sizeof(***p1) == sizeof(unsigned short))
-                r += sprintf(r, "unsigned short");
-            else if (sizeof(***p1) == sizeof(unsigned char))
-                r += sprintf(r, "unsigned char");
-            else if (sizeof(***p1) == sizeof(unsigned long))
-                r += sprintf(r, "unsigned long");
-            else if (sizeof(***p1) == sizeof(unsigned long long))
-                r += sprintf(r, "unsigned long long");
-            else
-                r += sprintf(r, "uint%u_t", (int)sizeof(***p1) * 8);
-        }
-        else {
-            if (sizeof(***p1) == sizeof(int))
-                r += sprintf(r, "int");
-            else if (sizeof(***p1) == sizeof(short))
-                r += sprintf(r, "short");
-            else if (sizeof(***p1) == sizeof(signed char))
-                r += sprintf(r, "signed char");
-            else if (sizeof(***p1) == sizeof(long))
-                r += sprintf(r, "long");
-            else if (sizeof(***p1) == sizeof(long long))
-                r += sprintf(r, "long long");
-            else
-                r += sprintf(r, "int%u_t", (int)sizeof(***p1) * 8);
-        }
-        r += sprintf(r, " (*foo_t)[%lld];\n", (long long)(sizeof(**p1) / 
sizeof(***p1)));
-        f2:;
+        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);
+        cb->define_type(cb, "foo_t", t3);
+#expect TYPEDEF foo_t = PTR ARRAY[27] int
     }
-    return r1;
 }
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to