[Python-3000-checkins] r53892 - in python/branches/p3yk: Include/Python-ast.h Lib/test/test_bytes.py Objects/bytesobject.c Python/symtable.c
georg.brandl
python-3000-checkins at python.org
Sat Feb 24 20:41:39 CET 2007
Author: georg.brandl
Date: Sat Feb 24 20:41:35 2007
New Revision: 53892
Modified:
python/branches/p3yk/Include/Python-ast.h
python/branches/p3yk/Lib/test/test_bytes.py
python/branches/p3yk/Objects/bytesobject.c
python/branches/p3yk/Python/symtable.c
Log:
Make bytes_repr return a string containing a b"" literal.
Modified: python/branches/p3yk/Include/Python-ast.h
==============================================================================
--- python/branches/p3yk/Include/Python-ast.h (original)
+++ python/branches/p3yk/Include/Python-ast.h Sat Feb 24 20:41:35 2007
@@ -516,4 +516,3 @@
alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena);
PyObject* PyAST_mod2obj(mod_ty t);
-
Modified: python/branches/p3yk/Lib/test/test_bytes.py
==============================================================================
--- python/branches/p3yk/Lib/test/test_bytes.py (original)
+++ python/branches/p3yk/Lib/test/test_bytes.py Sat Feb 24 20:41:35 2007
@@ -69,9 +69,11 @@
self.assertRaises(ValueError, bytes, [10**100])
def test_repr(self):
- self.assertEqual(repr(bytes()), "bytes()")
- self.assertEqual(repr(bytes([0])), "bytes([0x00])")
- self.assertEqual(repr(bytes([0, 1, 254, 255])), "bytes([0x00, 0x01, 0xfe, 0xff])")
+ self.assertEqual(repr(bytes()), "b''")
+ self.assertEqual(repr(bytes([0])), "b'\\0'")
+ self.assertEqual(repr(bytes([0, 1, 254, 255])), "b'\\0\\x01\\xfe\\xff'")
+ self.assertEqual(repr(bytes('abc')), "b'abc'")
+ self.assertEqual(repr(bytes("'")), "b'\\''")
def test_compare(self):
b1 = bytes([1, 2, 3])
Modified: python/branches/p3yk/Objects/bytesobject.c
==============================================================================
--- python/branches/p3yk/Objects/bytesobject.c (original)
+++ python/branches/p3yk/Objects/bytesobject.c Sat Feb 24 20:41:35 2007
@@ -733,65 +733,63 @@
return -1;
}
+/* Mostly copied from string_repr, but without the
+ "smart quote" functionality. */
static PyObject *
bytes_repr(PyBytesObject *self)
{
- PyObject *list;
- PyObject *str;
- PyObject *result;
- int err;
- int i;
-
- if (self->ob_size == 0)
- return PyString_FromString("bytes()");
-
- list = PyList_New(0);
- if (list == NULL)
+ size_t newsize = 3 + 4 * self->ob_size;
+ PyObject *v;
+ if (newsize > PY_SSIZE_T_MAX || newsize / 4 != self->ob_size) {
+ PyErr_SetString(PyExc_OverflowError,
+ "bytes object is too large to make repr");
return NULL;
-
- str = PyString_FromString("bytes([");
- if (str == NULL)
- goto error;
-
- err = PyList_Append(list, str);
- Py_DECREF(str);
- if (err < 0)
- goto error;
-
- for (i = 0; i < self->ob_size; i++) {
- char buffer[20];
- sprintf(buffer, ", 0x%02x", (unsigned char) (self->ob_bytes[i]));
- str = PyString_FromString((i == 0) ? buffer+2 : buffer);
- if (str == NULL)
- goto error;
- err = PyList_Append(list, str);
- Py_DECREF(str);
- if (err < 0)
- goto error;
}
-
- str = PyString_FromString("])");
- if (str == NULL)
- goto error;
-
- err = PyList_Append(list, str);
- Py_DECREF(str);
- if (err < 0)
- goto error;
-
- str = PyString_FromString("");
- if (str == NULL)
- goto error;
-
- result = _PyString_Join(str, list);
- Py_DECREF(str);
- Py_DECREF(list);
- return result;
-
- error:
- /* Error handling when list != NULL */
- Py_DECREF(list);
- return NULL;
+ v = PyString_FromStringAndSize((char *)NULL, newsize);
+ if (v == NULL) {
+ return NULL;
+ }
+ else {
+ register Py_ssize_t i;
+ register char c;
+ register char *p;
+ int quote = '\'';
+
+ p = PyString_AS_STRING(v);
+ *p++ = 'b';
+ *p++ = quote;
+ for (i = 0; i < self->ob_size; i++) {
+ /* There's at least enough room for a hex escape
+ and a closing quote. */
+ assert(newsize - (p - PyString_AS_STRING(v)) >= 5);
+ c = self->ob_bytes[i];
+ if (c == quote || c == '\\')
+ *p++ = '\\', *p++ = c;
+ else if (c == '\t')
+ *p++ = '\\', *p++ = 't';
+ else if (c == '\n')
+ *p++ = '\\', *p++ = 'n';
+ else if (c == '\r')
+ *p++ = '\\', *p++ = 'r';
+ else if (c == 0)
+ *p++ = '\\', *p++ = '0';
+ else if (c < ' ' || c >= 0x7f) {
+ /* For performance, we don't want to call
+ PyOS_snprintf here (extra layers of
+ function call). */
+ sprintf(p, "\\x%02x", c & 0xff);
+ p += 4;
+ }
+ else
+ *p++ = c;
+ }
+ assert(newsize - (p - PyString_AS_STRING(v)) >= 1);
+ *p++ = quote;
+ *p = '\0';
+ _PyString_Resize(
+ &v, (p - PyString_AS_STRING(v)));
+ return v;
+ }
}
static PyObject *
Modified: python/branches/p3yk/Python/symtable.c
==============================================================================
--- python/branches/p3yk/Python/symtable.c (original)
+++ python/branches/p3yk/Python/symtable.c Sat Feb 24 20:41:35 2007
@@ -1177,7 +1177,8 @@
break;
case Num_kind:
case Str_kind:
- case Ellipsis_kind:
+ case Bytes_kind:
+ case Ellipsis_kind:
/* Nothing to do here. */
break;
/* The following exprs can be assignment targets. */
More information about the Python-3000-checkins
mailing list