Author: Armin Rigo <[email protected]>
Branch:
Changeset: r86:f4143d8b619c
Date: 2014-11-18 19:40 +0100
http://bitbucket.org/cffi/creflect/changeset/f4143d8b619c/
Log: final test!
diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -562,17 +562,18 @@
include_alignment = True
else:
ptrtp = realtp[1:]
+ del realtp # don't use any more
assert not ptrtp.startswith('$')
sizetp = '*(%s)0' % ptrtp
insptp = '*%s' % ptrtp
include_alignment = False
#
- extra1 = "sizeof(%s)" % (sizetp,) # total size
+ text_size = "sizeof(%s)" % (sizetp,) # total size
if include_alignment:
- extra2 = ("(((char *)&((struct{char a; %s b;} *)0)->b)"
- " - (char *)0)" % (realtp,)) # alignment
+ text_offset = ("((char *)&((struct{char a; %s b;} *)0)->b)"
+ " - (char *)0" % (realtp,)) # alignment
else:
- extra2 = '0'
+ text_offset = '0'
d1 = funcblock.write_crx_field_var(len(self.fldnames))
t1 = self.type.get_type_var(funcblock)
#
@@ -609,9 +610,8 @@
block.writeline('%s[%d].bitshift = -1;' % (d1, i))
funcblock.write_subblock(block)
#
- funcblock.writeline('cb->complete(cb, %s, sizeof(%s),' % (t1, realtp))
- funcblock.writeline(' ((char *)&((struct{char a; %s b;} *)'
- '0)->b) - (char *)0,' % realtp)
+ funcblock.writeline('cb->complete(cb, %s, %s,' % (t1, text_size))
+ funcblock.writeline(' %s,' % text_offset)
funcblock.writeline(' %s, %d);' % (d1, len(self.fldnames)))
diff --git a/test/codegen/struct-005b.c b/test/codegen/struct-005b.c
--- a/test/codegen/struct-005b.c
+++ b/test/codegen/struct-005b.c
@@ -2,63 +2,37 @@
# ____________________________________________________________
-int teststruct_005b(char *r)
+void teststruct_005b(crx_builder_t *cb)
{
- if (!r)
- return 46 + 30 + 18 + 6 + 4 + 32;
- r += sprintf(r, "struct $$foo_p /*%lld*/{\n", (long
long)sizeof(*(foo_p)0));
+ crx_type_t *t1, *t2, *t3;
+ crx_field_t d1[1];
+ t1 = cb->get_struct_type(cb, "$$foo_p");
{
foo_p p1;
- long long o = ((char *)&((foo_p)0)->aa) - (char *)0; /* check that
'*foo_p::aa' is not an array */
char b[sizeof(p1->aa)];
- r += sprintf(r, " /*%lld*/", o);
+ size_t o = ((char *)&((foo_p)0)->aa) - (char *)0; /* check that
'*foo_p::aa' is not an array */
p1 = (void *)(((char *)b) - o);
(void)(p1->aa << 1); /* check that '*foo_p::aa' is an integer type */
p1->aa = -1; /* check that '*foo_p::aa' is not declared 'const' */
- if (p1->aa > 0) {
- if (sizeof(p1->aa) == 1 && p1->aa == 1)
- r += sprintf(r, "_Bool");
- else if (sizeof(p1->aa) == sizeof(unsigned int))
- r += sprintf(r, "unsigned int");
- else if (sizeof(p1->aa) == sizeof(unsigned short))
- r += sprintf(r, "unsigned short");
- else if (sizeof(p1->aa) == sizeof(unsigned char))
- r += sprintf(r, "unsigned char");
- else if (sizeof(p1->aa) == sizeof(unsigned long))
- r += sprintf(r, "unsigned long");
- else if (sizeof(p1->aa) == sizeof(unsigned long long))
- r += sprintf(r, "unsigned long long");
- else
- r += sprintf(r, "uint%u_t", (int)sizeof(p1->aa) * 8);
- }
- else {
- if (sizeof(p1->aa) == sizeof(int))
- r += sprintf(r, "int");
- else if (sizeof(p1->aa) == sizeof(short))
- r += sprintf(r, "short");
- else if (sizeof(p1->aa) == sizeof(signed char))
- r += sprintf(r, "signed char");
- else if (sizeof(p1->aa) == sizeof(long))
- r += sprintf(r, "long");
- else if (sizeof(p1->aa) == sizeof(long long))
- r += sprintf(r, "long long");
- else
- r += sprintf(r, "int%u_t", (int)sizeof(p1->aa) * 8);
- }
- r += sprintf(r, " aa;\n");
+ t2 = CRX_INT_TYPE(cb, p1->aa, "int");
+ d1[0].name = "aa";
+ d1[0].type = t2;
+ d1[0].offset = o;
+ d1[0].numbits = -1;
+ d1[0].bitshift = -1;
}
- r += sprintf(r, "};\n");
+ cb->complete(cb, t1, sizeof(*(foo_p)0),
+ 0,
+ d1, 1);
+#expect STRUCT $$foo_p:
+#expect | aa: int
{
foo_p *p1;
char *p2;
p1 = (void *)&p2;
*p1 = (void *)0; /* check that 'foo_p' is a pointer type */
- r += sprintf(r, "typedef struct $$foo_p *foo_p;\n");
+ t3 = cb->get_pointer_type(cb, t1);
+ cb->define_type(cb, "foo_p", t3);
+#expect TYPEDEF foo_p = PTR STRUCT $$foo_p
}
- return 0;
}
-
-#expect struct $$foo_p {
-#expect int aa;
-#expect };
-#expect typedef struct $$foo_p *foo_p;
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit