[pypy-commit] creflect default: The test 005 passes

arigo noreply at buildbot.pypy.org
Mon Sep 15 19:19:46 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r36:8a3909328cd4
Date: 2014-09-15 19:19 +0200
http://bitbucket.org/cffi/creflect/changeset/8a3909328cd4/

Log:	The test 005 passes

diff --git a/creflect/codegen.py b/creflect/codegen.py
--- a/creflect/codegen.py
+++ b/creflect/codegen.py
@@ -10,6 +10,7 @@
         self.codelines = []
         self.sprintfleft = ""
         self.sprintfright = ""
+        self.sprintfright_extra = ("", 0)
         self.sprintfmax = []
 
     def add_include(self, includename):
@@ -26,24 +27,29 @@
         assert '&' not in msg
         self.sprintfleft = self.sprintfleft + msg
 
-    def sprintf_add_right(self, msg):
+    def sprintf_add_right(self, msg, extra="", extralength=None):
         assert '&' not in msg
         self.sprintfright = msg + self.sprintfright
+        if extra:
+            assert extralength is not None, "specify 'extralength' explicitly"
+            extra = self.sprintfright_extra[0] + extra
+            extralength = self.sprintfright_extra[1] + extralength
+            self.sprintfright_extra = (extra, extralength)
 
     def sprintf_add_both_sides(self, marker):
         i = marker.index('&')
         self.sprintf_add_left(marker[:i])
         self.sprintf_add_right(marker[i+1:])
 
-    def sprintf(self, buf, extra="", maxlength=None, indent=0):
-        if maxlength is None:
-            assert not extra, "specify 'maxlength' explicitly"
-            maxlength = len(buf)
+    def sprintf(self, buf, extra="", extralength=None, indent=0):
+        if extralength is None:
+            assert not extra, "specify 'extralength' explicitly"
+            extralength = 0
         if extra:
             extra = ', ' + extra
         self.writeline('%sr += sprintf(r, "%s"%s);' %
                        (' ' * indent, buf, extra))
-        self.sprintfmax.append(maxlength)
+        self.sprintfmax.append(len(buf) + extralength)
 
     def flushleft(self):
         buf = self.sprintfleft
@@ -60,12 +66,18 @@
         self.sprintfmax[startindex:] = [m]
 
     def flush(self):
-        self.sprintfleft += self.sprintfright
-        self.sprintfright = ""
-        self.flushleft()
+        buf = self.sprintfleft + self.sprintfright
+        if buf:
+            self.sprintfleft = ""
+            self.sprintfright = ""
+            extra, extralength = self.sprintfright_extra
+            self.sprintfright_extra = ("", 0)
+            self.sprintf(buf, extra=extra, extralength=extralength)
 
     def get_skip_label(self):
-        self.skip_label_active = True
+        if not self.skip_label_active:
+            self.skip_label_active = True
+            self.writedecl('char *r0 = r;')
         return 'f%d' % (self.blocknum,)
 
     def close(self):
@@ -92,17 +104,24 @@
         self.skip_label_counter = 0
         self.skip_label_active = False
         self.block_counter = 0
+        self.return_value = False
 
     def next_block_num(self):
         r = self.block_counter
         self.block_counter = r + 1
         return r
 
+    def need_return_value(self):
+        if not self.return_value:
+            self.return_value = True
+            self.funcblock.writedecl("int r1 = 0;")
+
     def generate(self, funcname):
         outerblock = CodeBlock(self)
         outerblock.writeline('int %s(char *r)' % (funcname,))
 
         funcblock = CodeBlock(self)
+        self.funcblock = funcblock
 
         for decl in self.csource.get_declarations():
             decl.write_declaration(funcblock)
@@ -114,7 +133,10 @@
         else:
             funcblock.writedecl('    return 1;')
             funcblock.writedecl('*r = 0;')
-        funcblock.writeline('return 0;')
+        if self.return_value:
+            funcblock.writeline('return r1;')
+        else:
+            funcblock.writeline('return 0;')
 
         outerblock.write_subblock(funcblock)
         outerblock.writeline('')
diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -106,7 +106,7 @@
             block.sprintf(ut, indent=8)
         block.writeline("    else")
         block.sprintf("uint%u_t", "(int)sizeof(%s) * 8" % (star_p1,),
-                      maxlength=18, indent=8)
+                      extralength=10, indent=8)
         block.writeline("}")
         block.writeline("else {")
         elsecase = ""
@@ -119,7 +119,7 @@
             elsecase = "else "
         block.writeline("    else")
         block.sprintf("int%u_t", "(int)sizeof(%s) * 8" % (star_p1,),
-                      maxlength=18, indent=8)
+                      extralength=10, indent=8)
         block.writeline("}")
         block.end_disjoint_cases(disjunction)
         block.sprintf_add_left(" ")
@@ -176,29 +176,32 @@
         self.c_name_with_marker = (
             self.item.c_name_with_marker.replace('&', brackets))
 
-    def outer_decl(self, outer):
-        star_p1 = outer.fetch_star_p1()
+    def inspect_type(self, block, inspect):
+        star_p1 = inspect.fetch_star_p1()
         errmsg = "type '%s' is not an array, but a pointer type" % (
-            outer.get_comment_type(0, False),)
+            inspect.get_comment_type(0, False),)
         def after():
             ampersand_star_p1 = '&' + star_p1
             if ampersand_star_p1.startswith('&*'):
                 ampersand_star_p1 = ampersand_star_p1[2:]
-            outer.codelines.append("if ((void *)%s != (void *)%s) {" % (
+            block.writeline("if ((void *)%s != (void *)%s) {" % (
                 ampersand_star_p1, star_p1))
-            outer.codelines.append("    r(\"E:%s\", 0, 0);" % (errmsg,))
-            outer.codelines.append("    goto %s;" % (
-                outer.tr.get_skip_label(),))
-            outer.codelines.append("}")
+            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("}")
         def at_end():
             outer.codelines.append("a[%d] = (void *)(sizeof(%s) / sizeof(*%s));"
                                    % (outer.tr.fetch_next_a_index(),
                                       star_p1, star_p1))
-        outer.levels.append('[]')
-        outer.after_star_p1_assignment.append(after)
-        outer.at_end.append(at_end)
-        typeexpr = self.item.outer_decl(outer)
-        return typeexpr.replace('&', '&[?]')
+        inspect.levels.append('[]')
+        inspect.after_star_p1_assignment.append(after)
+        block.sprintf_add_right('[%lld]',
+            extra='(long long)(sizeof(*p1) / sizeof(**p1))',
+            extralength=20)
+        self.item.inspect_type(block, inspect)
 
 
 class StructOrUnionOrEnum(BaseTypeByIdentity):
diff --git a/test/codegen/005.c b/test/codegen/005.c
--- a/test/codegen/005.c
+++ b/test/codegen/005.c
@@ -4,22 +4,55 @@
 
 int test005(char *r)
 {
+    int r1 = 0;
     if (!r)
-        return 8 + 18 + 8 + 1;
+        return 57 + 8 + 18 + 35;
     {
         foo_t *p1;
         char b[sizeof(**p1)];  /* check that 'foo_t[]' is a valid type */
+        char *r0 = r;
         p1 = (void *)b;
         if ((void *)p1 != (void *)*p1) {
-            r("E:type 'foo_t' is not an array, but a pointer type", 0, 0);
-            goto f1;
+            r = r0;
+            r += sprintf(r, "#error type 'foo_t' is not an array, but a pointer type\n");
+            r1 = -1;
+            goto f2;
         }
         (void)(**p1 << 1);  /* check that 'foo_t[]' is an integer type */
         r += sprintf(r, "typedef ");
         **p1 = -1;
-        a[0] = (void *)(**p1 > 0 ? sizeof(**p1) : -sizeof(**p1));
-        a[1] = (void *)(sizeof(*p1) / sizeof(**p1));
+        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:;
     }
-    r("=foo_t:int?[?]", a, 2);
-  f1:;
+    return r1;
 }


More information about the pypy-commit mailing list