Author: Armin Rigo <[email protected]>
Branch: py3.6
Changeset: r96889:ebf82d863e50
Date: 2019-07-01 13:21 +0200
http://bitbucket.org/pypy/pypy/changeset/ebf82d863e50/
Log: hg merge bc7aeb4d5987 (step-by-step merging with default)
diff --git a/extra_tests/cffi_tests/cffi1/test_recompiler.py
b/extra_tests/cffi_tests/cffi1/test_recompiler.py
--- a/extra_tests/cffi_tests/cffi1/test_recompiler.py
+++ b/extra_tests/cffi_tests/cffi1/test_recompiler.py
@@ -2360,3 +2360,56 @@
assert q[0].a == p.a
assert q[0].b == p.b
assert q == p
+
+def test_unnamed_bitfield_1():
+ ffi = FFI()
+ ffi.cdef("""struct A { char : 1; };""")
+ lib = verify(ffi, "test_unnamed_bitfield_1", """
+ struct A { char : 1; };
+ """)
+ p = ffi.new("struct A *")
+ assert ffi.sizeof(p[0]) == 1
+ # Note: on gcc, the type name is ignored for anonymous bitfields
+ # and that's why the result is 1. On MSVC, the result is
+ # sizeof("char") which is also 1.
+
+def test_unnamed_bitfield_2():
+ ffi = FFI()
+ ffi.cdef("""struct A {
+ short c : 1; short : 1; short d : 1; short : 1; };""")
+ lib = verify(ffi, "test_unnamed_bitfield_2", """
+ struct A {
+ short c : 1; short : 1; short d : 1; short : 1;
+ };
+ """)
+ p = ffi.new("struct A *")
+ assert ffi.sizeof(p[0]) == ffi.sizeof("short")
+
+def test_unnamed_bitfield_3():
+ ffi = FFI()
+ ffi.cdef("""struct A { struct { char : 1; char : 1; } b; };""")
+ lib = verify(ffi, "test_unnamed_bitfield_3", """
+ struct A { struct { char : 1; char : 1; } b; };
+ """)
+ p = ffi.new("struct A *")
+ assert ffi.sizeof(p[0]) == 1
+ # Note: on gcc, the type name is ignored for anonymous bitfields
+ # and that's why the result is 1. On MSVC, the result is
+ # sizeof("char") which is also 1.
+
+def test_unnamed_bitfield_4():
+ ffi = FFI()
+ ffi.cdef("""struct A { struct {
+ unsigned c : 1; unsigned : 1; unsigned d : 1; unsigned : 1; } a;
+ };
+ struct B { struct A a; };""")
+ lib = verify(ffi, "test_unnamed_bitfield_4", """
+ struct A { struct {
+ unsigned c : 1; unsigned : 1; unsigned d : 1; unsigned : 1; } a;
+ };
+ struct B { struct A a; };
+ """)
+ b = ffi.new("struct B *")
+ a = ffi.new("struct A *")
+ assert ffi.sizeof(a[0]) == ffi.sizeof("unsigned")
+ assert ffi.sizeof(b[0]) == ffi.sizeof(a[0])
diff --git a/lib_pypy/cffi/recompiler.py b/lib_pypy/cffi/recompiler.py
--- a/lib_pypy/cffi/recompiler.py
+++ b/lib_pypy/cffi/recompiler.py
@@ -855,8 +855,9 @@
try:
if ftype.is_integer_type() or fbitsize >= 0:
# accept all integers, but complain on float or double
- prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is "
- "an integer */" % (fname, cname, fname))
+ if fname != '':
+ prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is
"
+ "an integer */" % (fname, cname, fname))
continue
# only accept exactly the type declared, except that '[]'
# is interpreted as a '*' and so will match any array length.
diff --git a/pypy/module/_cffi_backend/newtype.py
b/pypy/module/_cffi_backend/newtype.py
--- a/pypy/module/_cffi_backend/newtype.py
+++ b/pypy/module/_cffi_backend/newtype.py
@@ -549,10 +549,11 @@
if sflags & SF_GCC_BIG_ENDIAN:
bitshift = 8 * ftype.size - fbitsize- bitshift
- fld = ctypestruct.W_CField(ftype, field_offset_bytes,
- bitshift, fbitsize, fflags)
- fields_list.append(fld)
- fields_dict[fname] = fld
+ if fname != '':
+ fld = ctypestruct.W_CField(ftype, field_offset_bytes,
+ bitshift, fbitsize, fflags)
+ fields_list.append(fld)
+ fields_dict[fname] = fld
if boffset > boffsetmax:
boffsetmax = boffset
diff --git a/rpython/rlib/_rsocket_rffi.py b/rpython/rlib/_rsocket_rffi.py
--- a/rpython/rlib/_rsocket_rffi.py
+++ b/rpython/rlib/_rsocket_rffi.py
@@ -1426,10 +1426,10 @@
return rwin32.FormatError(errno)
def socket_strerror_unicode(errno):
- return rwin32.FormatErrorW(errno)[0]
+ return rwin32.FormatErrorW(errno)[0].decode('utf-8')
def gai_strerror_unicode(errno):
- return rwin32.FormatErrorW(errno)[0]
+ return rwin32.FormatErrorW(errno)[0].decode('utf-8')
def socket_strerror_utf8(errno):
return rwin32.FormatErrorW(errno)
diff --git a/rpython/rlib/rvmprof/src/shared/vmp_stack.c
b/rpython/rlib/rvmprof/src/shared/vmp_stack.c
--- a/rpython/rlib/rvmprof/src/shared/vmp_stack.c
+++ b/rpython/rlib/rvmprof/src/shared/vmp_stack.c
@@ -82,12 +82,6 @@
static PY_STACK_FRAME_T * _write_python_stack_entry(PY_STACK_FRAME_T * frame,
void ** result, int * depth, int max_depth)
{
- int len;
- int addr;
- int j;
- uint64_t line;
- char *lnotab;
-
#ifndef RPYTHON_VMPROF // pypy does not support line profiling
if (vmp_profiles_python_lines()) {
// In the line profiling mode we save a line number for every frame.
@@ -99,27 +93,8 @@
// NOTE: the profiling overhead can be reduced by storing co_lnotab in
the dump and
// moving this computation to the reader instead of doing it here.
- lnotab = PyStr_AS_STRING(frame->f_code->co_lnotab);
-
- if (lnotab != NULL) {
- line = (uint64_t)frame->f_lineno;
- addr = 0;
-
- len = (int)PyStr_GET_SIZE(frame->f_code->co_lnotab);
-
- for (j = 0; j < len; j += 2) {
- addr += lnotab[j];
- if (addr > frame->f_lasti) {
- break;
- }
- line += lnotab[j+1];
- }
- result[*depth] = (void*) line;
- *depth = *depth + 1;
- } else {
- result[*depth] = (void*) 0;
- *depth = *depth + 1;
- }
+ result[*depth] = (void*) (int64_t) PyFrame_GetLineNumber(frame);
+ *depth = *depth + 1;
}
result[*depth] = (void*)CODE_ADDR_TO_UID(FRAME_CODE(frame));
*depth = *depth + 1;
diff --git a/rpython/rlib/rvmprof/test/test_file.py
b/rpython/rlib/rvmprof/test/test_file.py
--- a/rpython/rlib/rvmprof/test/test_file.py
+++ b/rpython/rlib/rvmprof/test/test_file.py
@@ -37,7 +37,7 @@
#
if no_matches:
print
- print 'The following file dit NOT match'
+ print 'The following file did NOT match'
for f in no_matches:
print ' ', f.relto(RVMPROF)
raise AssertionError("some files were updated on github, "
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit