[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