mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-07-16 04:35:13 +03:00
works around a bug in abuild where apk info --who-owns on the .so files returns -stage0 (the package name of this bootstrap), which then adds it to the depends of pypy, which makes it uninstallable as they cannot be pulled in at the same time. like this, it will instead add pypy-bootstrap, which will be resolved by itself.
150 lines
5.5 KiB
Text
150 lines
5.5 KiB
Text
bpo-42938: Replace snprintf with Python unicode formatting in ctypes param reprs.
|
|
--- Python-2.7.18.orig/Lib/ctypes/test/test_parameters.py
|
|
+++ Python-2.7.18/Lib/ctypes/test/test_parameters.py
|
|
@@ -206,6 +206,49 @@
|
|
with self.assertRaises(ZeroDivisionError):
|
|
WorseStruct().__setstate__({}, b'foo')
|
|
|
|
+ def test_parameter_repr(self):
|
|
+ from ctypes import (
|
|
+ c_bool,
|
|
+ c_char,
|
|
+ c_wchar,
|
|
+ c_byte,
|
|
+ c_ubyte,
|
|
+ c_short,
|
|
+ c_ushort,
|
|
+ c_int,
|
|
+ c_uint,
|
|
+ c_long,
|
|
+ c_ulong,
|
|
+ c_longlong,
|
|
+ c_ulonglong,
|
|
+ c_float,
|
|
+ c_double,
|
|
+ c_longdouble,
|
|
+ c_char_p,
|
|
+ c_wchar_p,
|
|
+ c_void_p,
|
|
+ )
|
|
+ self.assertRegexpMatches(repr(c_bool.from_param(True)), r"^<cparam '\?' at 0x[A-Fa-f0-9]+>$")
|
|
+ self.assertEqual(repr(c_char.from_param('a')), "<cparam 'c' (a)>")
|
|
+ self.assertRegexpMatches(repr(c_wchar.from_param('a')), r"^<cparam 'u' at 0x[A-Fa-f0-9]+>$")
|
|
+ self.assertEqual(repr(c_byte.from_param(98)), "<cparam 'b' (98)>")
|
|
+ self.assertEqual(repr(c_ubyte.from_param(98)), "<cparam 'B' (98)>")
|
|
+ self.assertEqual(repr(c_short.from_param(511)), "<cparam 'h' (511)>")
|
|
+ self.assertEqual(repr(c_ushort.from_param(511)), "<cparam 'H' (511)>")
|
|
+ self.assertRegexpMatches(repr(c_int.from_param(20000)), r"^<cparam '[li]' \(20000\)>$")
|
|
+ self.assertRegexpMatches(repr(c_uint.from_param(20000)), r"^<cparam '[LI]' \(20000\)>$")
|
|
+ self.assertRegexpMatches(repr(c_long.from_param(20000)), r"^<cparam '[li]' \(20000\)>$")
|
|
+ self.assertRegexpMatches(repr(c_ulong.from_param(20000)), r"^<cparam '[LI]' \(20000\)>$")
|
|
+ self.assertRegexpMatches(repr(c_longlong.from_param(20000)), r"^<cparam '[liq]' \(20000\)>$")
|
|
+ self.assertRegexpMatches(repr(c_ulonglong.from_param(20000)), r"^<cparam '[LIQ]' \(20000\)>$")
|
|
+ self.assertEqual(repr(c_float.from_param(1.5)), "<cparam 'f' (1.5)>")
|
|
+ self.assertEqual(repr(c_double.from_param(1.5)), "<cparam 'd' (1.5)>")
|
|
+ self.assertEqual(repr(c_double.from_param(1e300)), "<cparam 'd' (1e+300)>")
|
|
+ self.assertRegexpMatches(repr(c_longdouble.from_param(1.5)), r"^<cparam ('d' \(1.5\)|'g' at 0x[A-Fa-f0-9]+)>$")
|
|
+ self.assertRegexpMatches(repr(c_char_p.from_param(b'hihi')), "^<cparam 'z' \(0x[A-Fa-f0-9]+\)>$")
|
|
+ self.assertRegexpMatches(repr(c_wchar_p.from_param('hihi')), "^<cparam 'Z' \(0x[A-Fa-f0-9]+\)>$")
|
|
+ self.assertRegexpMatches(repr(c_void_p.from_param(0x12)), r"^<cparam 'P' \(0x0*12\)>$")
|
|
+
|
|
################################################################
|
|
|
|
if __name__ == '__main__':
|
|
--- Python-2.7.18.orig/Modules/_ctypes/callproc.c
|
|
+++ Python-2.7.18/Modules/_ctypes/callproc.c
|
|
@@ -460,50 +460,53 @@
|
|
static PyObject *
|
|
PyCArg_repr(PyCArgObject *self)
|
|
{
|
|
- char buffer[256];
|
|
switch(self->tag) {
|
|
case 'b':
|
|
case 'B':
|
|
- sprintf(buffer, "<cparam '%c' (%d)>",
|
|
+ return PyString_FromFormat("<cparam '%c' (%d)>",
|
|
self->tag, self->value.b);
|
|
- break;
|
|
case 'h':
|
|
case 'H':
|
|
- sprintf(buffer, "<cparam '%c' (%d)>",
|
|
+ return PyString_FromFormat("<cparam '%c' (%d)>",
|
|
self->tag, self->value.h);
|
|
- break;
|
|
case 'i':
|
|
case 'I':
|
|
- sprintf(buffer, "<cparam '%c' (%d)>",
|
|
+ return PyString_FromFormat("<cparam '%c' (%d)>",
|
|
self->tag, self->value.i);
|
|
- break;
|
|
case 'l':
|
|
case 'L':
|
|
- sprintf(buffer, "<cparam '%c' (%ld)>",
|
|
+ return PyString_FromFormat("<cparam '%c' (%ld)>",
|
|
self->tag, self->value.l);
|
|
- break;
|
|
|
|
#ifdef HAVE_LONG_LONG
|
|
case 'q':
|
|
case 'Q':
|
|
- sprintf(buffer,
|
|
- "<cparam '%c' (%" PY_FORMAT_LONG_LONG "d)>",
|
|
+ return PyString_FromFormat("<cparam '%c' (%" PY_FORMAT_LONG_LONG "d)>",
|
|
self->tag, self->value.q);
|
|
- break;
|
|
#endif
|
|
case 'd':
|
|
- sprintf(buffer, "<cparam '%c' (%f)>",
|
|
- self->tag, self->value.d);
|
|
- break;
|
|
- case 'f':
|
|
- sprintf(buffer, "<cparam '%c' (%f)>",
|
|
- self->tag, self->value.f);
|
|
- break;
|
|
+ case 'f': {
|
|
+ PyObject *f = PyFloat_FromDouble((self->tag == 'f') ? self->value.f : self->value.d);
|
|
+ if (f == NULL) {
|
|
+ return NULL;
|
|
+ }
|
|
+ PyObject *r = PyObject_Repr(f);
|
|
+ Py_DECREF(f);
|
|
+ if (r == NULL) {
|
|
+ return NULL;
|
|
+ }
|
|
+ char *value = PyString_AsString(r);
|
|
+ Py_DECREF(r);
|
|
+ if (value == NULL) {
|
|
+ return NULL;
|
|
+ }
|
|
+ return PyString_FromFormat("<cparam '%c' (%s)>",
|
|
+ self->tag, value);
|
|
+ }
|
|
|
|
case 'c':
|
|
- sprintf(buffer, "<cparam '%c' (%c)>",
|
|
+ return PyString_FromFormat("<cparam '%c' (%c)>",
|
|
self->tag, self->value.c);
|
|
- break;
|
|
|
|
/* Hm, are these 'z' and 'Z' codes useful at all?
|
|
Shouldn't they be replaced by the functionality of c_string
|
|
@@ -512,16 +515,13 @@
|
|
case 'z':
|
|
case 'Z':
|
|
case 'P':
|
|
- sprintf(buffer, "<cparam '%c' (%p)>",
|
|
+ return PyString_FromFormat("<cparam '%c' (%p)>",
|
|
self->tag, self->value.p);
|
|
- break;
|
|
|
|
default:
|
|
- sprintf(buffer, "<cparam '%c' at %p>",
|
|
+ return PyString_FromFormat("<cparam '%c' at %p>",
|
|
self->tag, self);
|
|
- break;
|
|
}
|
|
- return PyString_FromString(buffer);
|
|
}
|
|
|
|
static PyMemberDef PyCArgType_members[] = {
|
|
|