mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
make 'c' only accept bytes and 'C' only unicode #5499
This commit is contained in:
parent
605b9d9fe8
commit
7fe9853596
4 changed files with 15 additions and 14 deletions
|
@ -208,9 +208,13 @@ variable(s) whose address should be passed.
|
||||||
Convert a Python integer to a C :ctype:`Py_ssize_t`.
|
Convert a Python integer to a C :ctype:`Py_ssize_t`.
|
||||||
|
|
||||||
``c`` (string of length 1) [char]
|
``c`` (string of length 1) [char]
|
||||||
Convert a Python character, represented as a string of length 1, to a C
|
Convert a Python character, represented as a byte string of length 1, to a C
|
||||||
:ctype:`char`.
|
:ctype:`char`.
|
||||||
|
|
||||||
|
``C`` (string of length 1) [int]
|
||||||
|
Covert a Python character, represented as a unicode string of length 1, to a
|
||||||
|
C :ctype:`int`.
|
||||||
|
|
||||||
``f`` (float) [float]
|
``f`` (float) [float]
|
||||||
Convert a Python floating point number to a C :ctype:`float`.
|
Convert a Python floating point number to a C :ctype:`float`.
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ class MixinBytesBufferCommonTests(object):
|
||||||
self.assertEqual(b'abc ', self.marshal(b'abc').ljust(6))
|
self.assertEqual(b'abc ', self.marshal(b'abc').ljust(6))
|
||||||
self.assertEqual(b'abc', self.marshal(b'abc').ljust(3))
|
self.assertEqual(b'abc', self.marshal(b'abc').ljust(3))
|
||||||
self.assertEqual(b'abc', self.marshal(b'abc').ljust(2))
|
self.assertEqual(b'abc', self.marshal(b'abc').ljust(2))
|
||||||
self.assertEqual(b'abc*******', self.marshal(b'abc').ljust(10, '*'))
|
self.assertEqual(b'abc*******', self.marshal(b'abc').ljust(10, b'*'))
|
||||||
self.assertRaises(TypeError, self.marshal(b'abc').ljust)
|
self.assertRaises(TypeError, self.marshal(b'abc').ljust)
|
||||||
|
|
||||||
def test_rjust(self):
|
def test_rjust(self):
|
||||||
|
@ -120,7 +120,7 @@ class MixinBytesBufferCommonTests(object):
|
||||||
self.assertEqual(b' abc', self.marshal(b'abc').rjust(6))
|
self.assertEqual(b' abc', self.marshal(b'abc').rjust(6))
|
||||||
self.assertEqual(b'abc', self.marshal(b'abc').rjust(3))
|
self.assertEqual(b'abc', self.marshal(b'abc').rjust(3))
|
||||||
self.assertEqual(b'abc', self.marshal(b'abc').rjust(2))
|
self.assertEqual(b'abc', self.marshal(b'abc').rjust(2))
|
||||||
self.assertEqual(b'*******abc', self.marshal(b'abc').rjust(10, '*'))
|
self.assertEqual(b'*******abc', self.marshal(b'abc').rjust(10, b'*'))
|
||||||
self.assertRaises(TypeError, self.marshal(b'abc').rjust)
|
self.assertRaises(TypeError, self.marshal(b'abc').rjust)
|
||||||
|
|
||||||
def test_center(self):
|
def test_center(self):
|
||||||
|
@ -128,7 +128,7 @@ class MixinBytesBufferCommonTests(object):
|
||||||
self.assertEqual(b' abc ', self.marshal(b'abc').center(6))
|
self.assertEqual(b' abc ', self.marshal(b'abc').center(6))
|
||||||
self.assertEqual(b'abc', self.marshal(b'abc').center(3))
|
self.assertEqual(b'abc', self.marshal(b'abc').center(3))
|
||||||
self.assertEqual(b'abc', self.marshal(b'abc').center(2))
|
self.assertEqual(b'abc', self.marshal(b'abc').center(2))
|
||||||
self.assertEqual(b'***abc****', self.marshal(b'abc').center(10, '*'))
|
self.assertEqual(b'***abc****', self.marshal(b'abc').center(10, b'*'))
|
||||||
self.assertRaises(TypeError, self.marshal(b'abc').center)
|
self.assertRaises(TypeError, self.marshal(b'abc').center)
|
||||||
|
|
||||||
def test_swapcase(self):
|
def test_swapcase(self):
|
||||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 3.1 alpha 2?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #5499: The 'c' code for argument parsing functions now only accepts a
|
||||||
|
byte, and the 'C' code only accepts a unicode character.
|
||||||
|
|
||||||
- Issue #1665206: Remove the last eager import in _warnings.c and make it lazy.
|
- Issue #1665206: Remove the last eager import in _warnings.c and make it lazy.
|
||||||
|
|
||||||
- Fix a segfault when running test_exceptions with coverage, caused by
|
- Fix a segfault when running test_exceptions with coverage, caused by
|
||||||
|
|
|
@ -776,24 +776,18 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
|
||||||
char *p = va_arg(*p_va, char *);
|
char *p = va_arg(*p_va, char *);
|
||||||
if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
|
if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
|
||||||
*p = PyBytes_AS_STRING(arg)[0];
|
*p = PyBytes_AS_STRING(arg)[0];
|
||||||
else if (PyUnicode_Check(arg) &&
|
|
||||||
PyUnicode_GET_SIZE(arg) == 1 &&
|
|
||||||
PyUnicode_AS_UNICODE(arg)[0] < 256)
|
|
||||||
*p = (char)PyUnicode_AS_UNICODE(arg)[0];
|
|
||||||
else
|
else
|
||||||
return converterr("char < 256", arg, msgbuf, bufsize);
|
return converterr("a byte string of length 1", arg, msgbuf, bufsize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'C': {/* unicode char */
|
case 'C': {/* unicode char */
|
||||||
int *p = va_arg(*p_va, int *);
|
int *p = va_arg(*p_va, int *);
|
||||||
if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
|
if (PyUnicode_Check(arg) &&
|
||||||
*p = PyBytes_AS_STRING(arg)[0];
|
PyUnicode_GET_SIZE(arg) == 1)
|
||||||
else if (PyUnicode_Check(arg) &&
|
|
||||||
PyUnicode_GET_SIZE(arg) == 1)
|
|
||||||
*p = PyUnicode_AS_UNICODE(arg)[0];
|
*p = PyUnicode_AS_UNICODE(arg)[0];
|
||||||
else
|
else
|
||||||
return converterr("char", arg, msgbuf, bufsize);
|
return converterr("a unicode character", arg, msgbuf, bufsize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue