[pypy-commit] cffi default: Attack issue 91; first step.
arigo
noreply at buildbot.pypy.org
Wed Jun 19 10:17:34 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r1271:3306e1a851ae
Date: 2013-06-19 09:45 +0200
http://bitbucket.org/cffi/cffi/changeset/3306e1a851ae/
Log: Attack issue 91; first step.
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -3351,22 +3351,18 @@
return (PyObject *)td;
}
-static PyObject *_b_struct_or_union_type(const char *kind, const char *name,
- int flag)
+static PyObject *_b_struct_or_union_type(const char *name, int flag)
{
- int kindlen = strlen(kind);
int namelen = strlen(name);
- CTypeDescrObject *td = ctypedescr_new(kindlen + 1 + namelen + 1);
+ CTypeDescrObject *td = ctypedescr_new(namelen + 1);
if (td == NULL)
return NULL;
td->ct_size = -1;
td->ct_length = -1;
td->ct_flags = flag | CT_IS_OPAQUE;
- memcpy(td->ct_name, kind, kindlen);
- td->ct_name[kindlen] = ' ';
- memcpy(td->ct_name + kindlen + 1, name, namelen + 1);
- td->ct_name_position = kindlen + 1 + namelen;
+ memcpy(td->ct_name, name, namelen + 1);
+ td->ct_name_position = namelen;
return (PyObject *)td;
}
@@ -3378,9 +3374,9 @@
return NULL;
flag = CT_STRUCT;
- if (strcmp(name, "_IO_FILE") == 0 || strcmp(name, "$FILE") == 0)
+ if (strcmp(name, "struct _IO_FILE") == 0 || strcmp(name, "FILE") == 0)
flag |= CT_IS_FILE;
- return _b_struct_or_union_type("struct", name, flag);
+ return _b_struct_or_union_type(name, flag);
}
static PyObject *b_new_union_type(PyObject *self, PyObject *args)
@@ -3388,7 +3384,7 @@
char *name;
if (!PyArg_ParseTuple(args, "s:new_union_type", &name))
return NULL;
- return _b_struct_or_union_type("union", name, CT_UNION);
+ return _b_struct_or_union_type(name, CT_UNION);
}
static CFieldObject *
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -652,6 +652,8 @@
def test_new_struct_type():
BStruct = new_struct_type("foo")
+ assert repr(BStruct) == "<ctype 'foo'>"
+ BStruct = new_struct_type("struct foo")
assert repr(BStruct) == "<ctype 'struct foo'>"
BPtr = new_pointer_type(BStruct)
assert repr(BPtr) == "<ctype 'struct foo *'>"
@@ -659,7 +661,7 @@
py.test.raises(ValueError, alignof, BStruct)
def test_new_union_type():
- BUnion = new_union_type("foo")
+ BUnion = new_union_type("union foo")
assert repr(BUnion) == "<ctype 'union foo'>"
BPtr = new_pointer_type(BUnion)
assert repr(BPtr) == "<ctype 'union foo *'>"
@@ -668,7 +670,7 @@
BLong = new_primitive_type("long")
BChar = new_primitive_type("char")
BShort = new_primitive_type("short")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
assert BStruct.kind == "struct"
assert BStruct.cname == "struct foo"
assert BStruct.fields is None
@@ -700,7 +702,7 @@
def test_complete_union():
BLong = new_primitive_type("long")
BChar = new_primitive_type("char")
- BUnion = new_union_type("foo")
+ BUnion = new_union_type("union foo")
assert BUnion.kind == "union"
assert BUnion.cname == "union foo"
assert BUnion.fields is None
@@ -719,7 +721,7 @@
def test_struct_instance():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
p = cast(BStructPtr, 0)
py.test.raises(AttributeError, "p.a1") # opaque
@@ -739,7 +741,7 @@
def test_union_instance():
BInt = new_primitive_type("int")
BUInt = new_primitive_type("unsigned int")
- BUnion = new_union_type("bar")
+ BUnion = new_union_type("union bar")
complete_struct_or_union(BUnion, [('a1', BInt, -1), ('a2', BUInt, -1)])
p = newp(new_pointer_type(BUnion), [-42])
bigval = -42 + (1 << (8*size_of_int()))
@@ -755,7 +757,7 @@
def test_struct_pointer():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BInt, -1),
('a2', BInt, -1)])
@@ -769,7 +771,7 @@
BVoidP = new_pointer_type(new_void_type())
BInt = new_primitive_type("int")
BIntPtr = new_pointer_type(BInt)
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BInt, -1),
('a2', BInt, -1),
@@ -803,7 +805,7 @@
def test_array_in_struct():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BArrayInt5 = new_array_type(new_pointer_type(BInt), 5)
complete_struct_or_union(BStruct, [('a1', BArrayInt5, -1)])
s = newp(new_pointer_type(BStruct), [[20, 24, 27, 29, 30]])
@@ -814,7 +816,7 @@
def offsetof(BType, fieldname):
return typeoffsetof(BType, fieldname)[1]
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
py.test.raises(TypeError, offsetof, BInt, "abc")
py.test.raises(TypeError, offsetof, BStruct, "abc")
complete_struct_or_union(BStruct, [('abc', BInt, -1), ('def', BInt, -1)])
@@ -843,7 +845,7 @@
def test_function_type_taking_struct():
BChar = new_primitive_type("char")
BShort = new_primitive_type("short")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a1', BChar, -1),
('a2', BShort, -1)])
BFunc = new_function_type((BStruct,), BShort, False)
@@ -948,7 +950,7 @@
def test_call_function_7():
BChar = new_primitive_type("char")
BShort = new_primitive_type("short")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BChar, -1),
('a2', BShort, -1)])
@@ -964,7 +966,7 @@
def test_call_function_20():
BChar = new_primitive_type("char")
BShort = new_primitive_type("short")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BChar, -1),
('a2', BShort, -1)])
@@ -976,7 +978,7 @@
def test_call_function_21():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a', BInt, -1),
('b', BInt, -1),
('c', BInt, -1),
@@ -996,7 +998,7 @@
def test_call_function_22():
BInt = new_primitive_type("int")
BArray10 = new_array_type(new_pointer_type(BInt), 10)
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructP = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a', BArray10, -1)])
BFunc22 = new_function_type((BStruct, BStruct), BStruct, False)
@@ -1034,7 +1036,7 @@
def test_cannot_pass_struct_with_array_of_length_0():
BInt = new_primitive_type("int")
BArray0 = new_array_type(new_pointer_type(BInt), 0)
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a', BArray0)])
py.test.raises(NotImplementedError, new_function_type,
(BStruct,), BInt, False)
@@ -1059,7 +1061,7 @@
def test_cannot_call_with_a_autocompleted_struct():
BSChar = new_primitive_type("signed char")
BDouble = new_primitive_type("double")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('c', BDouble, -1, 8),
('a', BSChar, -1, 2),
@@ -1232,7 +1234,7 @@
BSChar = new_primitive_type("signed char")
BInt = new_primitive_type("int")
BDouble = new_primitive_type("double")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a', BSChar, -1),
('b', BDouble, -1)])
@@ -1249,7 +1251,7 @@
def test_callback_returning_big_struct():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a', BInt, -1),
('b', BInt, -1),
@@ -1339,7 +1341,7 @@
def test_enum_in_struct():
BInt = new_primitive_type("int")
BEnum = new_enum_type("foo", ('def', 'c', 'ab'), (0, 1, -20), BInt)
- BStruct = new_struct_type("bar")
+ BStruct = new_struct_type("struct bar")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BEnum, -1)])
p = newp(BStructPtr, [-20])
@@ -1443,7 +1445,7 @@
def test_struct_with_bitfields():
BLong = new_primitive_type("long")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
LONGBITS = 8 * sizeof(BLong)
complete_struct_or_union(BStruct, [('a1', BLong, 1),
('a2', BLong, 2),
@@ -1466,7 +1468,7 @@
def test_bitfield_instance():
BInt = new_primitive_type("int")
BUnsignedInt = new_primitive_type("unsigned int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a1', BInt, 1),
('a2', BUnsignedInt, 2),
('a3', BInt, 3)])
@@ -1496,14 +1498,14 @@
def test_bitfield_instance_init():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a1', BInt, 1)])
p = newp(new_pointer_type(BStruct), [-1])
assert p.a1 == -1
p = newp(new_pointer_type(BStruct), {'a1': -1})
assert p.a1 == -1
#
- BUnion = new_union_type("bar")
+ BUnion = new_union_type("union bar")
complete_struct_or_union(BUnion, [('a1', BInt, 1)])
p = newp(new_pointer_type(BUnion), [-1])
assert p.a1 == -1
@@ -1572,7 +1574,7 @@
py.test.raises(IndexError, newp, BArray, tuple(b'123456'))
py.test.raises(IndexError, newp, BArray, list(b'123456'))
py.test.raises(IndexError, newp, BArray, b'123456')
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [])
py.test.raises(TypeError, newp, new_pointer_type(BStruct), b'')
py.test.raises(ValueError, newp, new_pointer_type(BStruct), [b'1'])
@@ -1612,7 +1614,7 @@
p = newp(new_pointer_type(BFloat), cast(BFloat, 12.25))
assert p[0] == 12.25
#
- BStruct = new_struct_type("foo_s")
+ BStruct = new_struct_type("struct foo_s")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BInt, -1)])
s1 = newp(BStructPtr, [42])
@@ -1630,7 +1632,7 @@
s2 = newp(BStructPtr, s1[0])
assert s2.a1 == 42
#
- BUnion = new_union_type("foo_u")
+ BUnion = new_union_type("union foo_u")
BUnionPtr = new_pointer_type(BUnion)
complete_struct_or_union(BUnion, [('a1', BInt, -1)])
u1 = newp(BUnionPtr, [42])
@@ -1708,7 +1710,7 @@
BChar = new_primitive_type("char")
BCharP = new_pointer_type(BChar)
BCharArray10 = new_array_type(BCharP, 10)
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BCharArray10, -1)])
p = newp(BStructPtr, None)
@@ -1725,7 +1727,7 @@
new_function_type((), BFunc) # works
new_function_type((), new_primitive_type("int"))
new_function_type((), new_pointer_type(BFunc))
- BUnion = new_union_type("foo_u")
+ BUnion = new_union_type("union foo_u")
complete_struct_or_union(BUnion, [])
py.test.raises(NotImplementedError, new_function_type, (), BUnion)
py.test.raises(TypeError, new_function_type, (), BArray)
@@ -1736,7 +1738,7 @@
BFloat = new_primitive_type("float")
BDouble = new_primitive_type("double")
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo_s")
+ BStruct = new_struct_type("struct foo_s")
complete_struct_or_union(BStruct, [('a1', BChar, -1),
('a2', BShort, -1)])
BFunc10 = new_function_type((BInt,), BStruct)
@@ -1746,7 +1748,7 @@
assert s.a1 == bytechr(40)
assert s.a2 == 40 * 40
#
- BStruct11 = new_struct_type("test11")
+ BStruct11 = new_struct_type("struct test11")
complete_struct_or_union(BStruct11, [('a1', BInt, -1),
('a2', BInt, -1)])
BFunc11 = new_function_type((BInt,), BStruct11)
@@ -1756,7 +1758,7 @@
assert s.a1 == 40
assert s.a2 == 40 * 40
#
- BStruct12 = new_struct_type("test12")
+ BStruct12 = new_struct_type("struct test12")
complete_struct_or_union(BStruct12, [('a1', BDouble, -1),
])
BFunc12 = new_function_type((BInt,), BStruct12)
@@ -1765,7 +1767,7 @@
assert repr(s) == "<cdata 'struct test12' owning 8 bytes>"
assert s.a1 == 40.0
#
- BStruct13 = new_struct_type("test13")
+ BStruct13 = new_struct_type("struct test13")
complete_struct_or_union(BStruct13, [('a1', BInt, -1),
('a2', BInt, -1),
('a3', BInt, -1)])
@@ -1777,7 +1779,7 @@
assert s.a2 == 40 * 40
assert s.a3 == 40 * 40 * 40
#
- BStruct14 = new_struct_type("test14")
+ BStruct14 = new_struct_type("struct test14")
complete_struct_or_union(BStruct14, [('a1', BFloat, -1),
])
BFunc14 = new_function_type((BInt,), BStruct14)
@@ -1786,7 +1788,7 @@
assert repr(s) == "<cdata 'struct test14' owning 4 bytes>"
assert s.a1 == 40.0
#
- BStruct15 = new_struct_type("test15")
+ BStruct15 = new_struct_type("struct test15")
complete_struct_or_union(BStruct15, [('a1', BFloat, -1),
('a2', BInt, -1)])
BFunc15 = new_function_type((BInt,), BStruct15)
@@ -1796,7 +1798,7 @@
assert s.a1 == 40.0
assert s.a2 == 40 * 40
#
- BStruct16 = new_struct_type("test16")
+ BStruct16 = new_struct_type("struct test16")
complete_struct_or_union(BStruct16, [('a1', BFloat, -1),
('a2', BFloat, -1)])
BFunc16 = new_function_type((BInt,), BStruct16)
@@ -1806,7 +1808,7 @@
assert s.a1 == 40.0
assert s.a2 == -40.0
#
- BStruct17 = new_struct_type("test17")
+ BStruct17 = new_struct_type("struct test17")
complete_struct_or_union(BStruct17, [('a1', BInt, -1),
('a2', BFloat, -1)])
BFunc17 = new_function_type((BInt,), BStruct17)
@@ -1829,7 +1831,7 @@
BFunc2 = new_function_type((), new_primitive_type("short"))
BCharP = new_pointer_type(new_primitive_type("char"))
BIntP = new_pointer_type(new_primitive_type("int"))
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BFunc, -1)])
newp(BStructPtr, [cast(BFunc, 0)])
@@ -1856,7 +1858,7 @@
assert not pyuni4
#
BWCharP = new_pointer_type(BWChar)
- BStruct = new_struct_type("foo_s")
+ BStruct = new_struct_type("struct foo_s")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BWChar, -1),
('a2', BWCharP, -1)])
@@ -1968,7 +1970,7 @@
# exception to the no-keepalive rule: p=newp(BStructPtr) returns a
# pointer owning the memory, and p[0] returns a pointer to the
# struct that *also* owns the memory
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', new_primitive_type("int"), -1),
('a2', new_primitive_type("int"), -1),
@@ -1988,7 +1990,7 @@
assert q.a1 == 123456
def test_nokeepalive_struct():
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
BStructPtrPtr = new_pointer_type(BStructPtr)
complete_struct_or_union(BStruct, [('a1', new_primitive_type("int"), -1)])
@@ -2175,7 +2177,7 @@
assert repr(x) == "<cdata 'int[3]' NULL>"
def test_cast_invalid():
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [])
p = cast(new_pointer_type(BStruct), 123456)
s = p[0]
@@ -2194,7 +2196,7 @@
def test_bug_delattr():
BLong = new_primitive_type("long")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a1', BLong, -1)])
x = newp(new_pointer_type(BStruct))
py.test.raises(AttributeError, "del x.a1")
@@ -2203,7 +2205,7 @@
py.test.skip("later")
BLong = new_primitive_type("long")
BArray = new_array_type(new_pointer_type(BLong), None)
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructP = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BLong, -1),
('a2', BArray, -1)])
@@ -2319,7 +2321,7 @@
BLong = new_primitive_type("long")
BLongP = new_pointer_type(BLong)
BArray0 = new_array_type(BLongP, length)
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BArray0, -1)])
p = newp(BStructPtr, None)
@@ -2331,8 +2333,8 @@
def test_nested_anonymous_struct():
BInt = new_primitive_type("int")
BChar = new_primitive_type("char")
- BStruct = new_struct_type("foo")
- BInnerStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
+ BInnerStruct = new_struct_type("struct foo")
complete_struct_or_union(BInnerStruct, [('a1', BInt, -1),
('a2', BChar, -1)])
complete_struct_or_union(BStruct, [('', BInnerStruct, -1),
@@ -2364,12 +2366,12 @@
BChar = new_primitive_type("char")
BShort = new_primitive_type("short")
assert sizeof(BShort) == alignof(BShort) == 2
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a1', BChar),
('a2', BChar),
('a3', BChar)])
assert sizeof(BStruct) == 3 and alignof(BStruct) == 1
- BUnion = new_union_type("u")
+ BUnion = new_union_type("union u")
complete_struct_or_union(BUnion, [('s', BStruct),
('i', BShort)])
assert sizeof(BUnion) == 4
@@ -2377,7 +2379,7 @@
def test_unaligned_struct():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('b', BInt, -1, 1)],
None, 5, 1)
@@ -2435,7 +2437,7 @@
def test_typeoffsetof():
BChar = new_primitive_type("char")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BChar, -1),
('a2', BChar, -1),
@@ -2451,14 +2453,14 @@
def test_typeoffsetof_no_bitfield():
BInt = new_primitive_type("int")
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
complete_struct_or_union(BStruct, [('a1', BInt, 4)])
py.test.raises(TypeError, typeoffsetof, BStruct, 'a1')
def test_rawaddressof():
BChar = new_primitive_type("char")
BCharP = new_pointer_type(BChar)
- BStruct = new_struct_type("foo")
+ BStruct = new_struct_type("struct foo")
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BChar, -1),
('a2', BChar, -1),
@@ -2519,7 +2521,7 @@
if sys.platform == "win32":
py.test.skip("testing FILE not implemented")
#
- BFILE = new_struct_type("_IO_FILE")
+ BFILE = new_struct_type("struct _IO_FILE")
BFILEP = new_pointer_type(BFILE)
BChar = new_primitive_type("char")
BCharP = new_pointer_type(BChar)
@@ -2551,7 +2553,7 @@
if sys.platform == "win32":
py.test.skip("testing FILE not implemented")
#
- B_NOT_FILE = new_struct_type("NOT_FILE")
+ B_NOT_FILE = new_struct_type("struct NOT_FILE")
B_NOT_FILEP = new_pointer_type(B_NOT_FILE)
BChar = new_primitive_type("char")
BCharP = new_pointer_type(BChar)
@@ -2574,7 +2576,7 @@
if sys.platform == "win32":
py.test.skip("testing FILE not implemented")
#
- BFILE = new_struct_type("$FILE")
+ BFILE = new_struct_type("FILE")
BFILEP = new_pointer_type(BFILE)
BChar = new_primitive_type("char")
BCharP = new_pointer_type(BChar)
@@ -2773,7 +2775,7 @@
BShort = new_primitive_type("short")
BInt = new_primitive_type("int")
BUInt = new_primitive_type("unsigned int")
- BStruct = new_struct_type("foo1")
+ BStruct = new_struct_type("struct foo1")
complete_struct_or_union(BStruct, [('a', BChar, -1),
('b1', BInt, 9),
('b2', BUInt, 7),
@@ -2786,7 +2788,7 @@
assert sizeof(BStruct) == 12
assert alignof(BStruct) == 4
#
- BStruct = new_struct_type("foo2")
+ BStruct = new_struct_type("struct foo2")
complete_struct_or_union(BStruct, [('a', BChar, -1),
('', BShort, 9),
('c', BChar, -1)], -1, -1, -1, flag)
@@ -2798,7 +2800,7 @@
assert sizeof(BStruct) == 6
assert alignof(BStruct) == 2
#
- BStruct = new_struct_type("foo2")
+ BStruct = new_struct_type("struct foo2")
complete_struct_or_union(BStruct, [('a', BChar, -1),
('', BInt, 0),
('', BInt, 0),
More information about the pypy-commit
mailing list