diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2000-07-11 20:55:38 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2000-07-11 20:55:38 (GMT) |
commit | 88887aa38eee7d6c12c5f5a108b6a0a4302d7ae5 (patch) | |
tree | 87bd975cf41ab8b763637798af42f76abca03fd8 | |
parent | 672fac0d65327f6f39013d34dc196ac010e86acd (diff) | |
download | cpython-88887aa38eee7d6c12c5f5a108b6a0a4302d7ae5.zip cpython-88887aa38eee7d6c12c5f5a108b6a0a4302d7ae5.tar.gz cpython-88887aa38eee7d6c12c5f5a108b6a0a4302d7ae5.tar.bz2 |
small updates to string_join:
use PyString_AS_STRING macro on local string object
when resizing string, make sure resized string will always be big enough
split string containing error message across two lines
add test to string_tests that causes resizing
-rw-r--r-- | Lib/test/string_tests.py | 3 | ||||
-rw-r--r-- | Objects/stringobject.c | 15 |
2 files changed, 12 insertions, 6 deletions
diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index e9168ef..d4041be 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -123,6 +123,9 @@ def run_method_tests(test): test('join', '.', u'a.b.c', ['a', u'b', 'c']) test('join', '.', u'a.b.c', ['a', 'b', u'c']) test('join', '.', TypeError, ['a', u'b', 3]) + for i in [5, 25, 125]: + test('join', '-', ((('a' * i) + '-') * i)[:-1], + ['a' * i] * i) test('join', ' ', TypeError, BadSeq1()) test('join', ' ', 'a b c', BadSeq2()) diff --git a/Objects/stringobject.c b/Objects/stringobject.c index dc41122..246e080 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -743,7 +743,7 @@ string_join(PyStringObject *self, PyObject *args) char *p; int seqlen = 0; int sz = 100; - int i, slen; + int i, slen, sz_incr; PyObject *orig, *seq, *item; if (!PyArg_ParseTuple(args, "O:join", &orig)) @@ -770,7 +770,7 @@ string_join(PyStringObject *self, PyObject *args) if (!(res = PyString_FromStringAndSize((char*)NULL, sz))) goto finally; - p = PyString_AsString(res); + p = PyString_AS_STRING(res); for (i = 0; i < seqlen; i++) { item = PySequence_Fast_GET_ITEM(seq, i); @@ -781,17 +781,20 @@ string_join(PyStringObject *self, PyObject *args) return PyUnicode_Join((PyObject *)self, seq); } PyErr_Format(PyExc_TypeError, - "sequence item %i: expected string, %.80s found", + "sequence item %i: expected string," + " %.80s found", i, item->ob_type->tp_name); goto finally; } slen = PyString_GET_SIZE(item); while (reslen + slen + seplen >= sz) { - if (_PyString_Resize(&res, sz*2)) { + /* at least double the size of the string */ + sz_incr = slen + seplen > sz ? slen + seplen : sz; + if (_PyString_Resize(&res, sz + sz_incr)) { goto finally; } - sz *= 2; - p = PyString_AsString(res) + reslen; + sz += sz_incr; + p = PyString_AS_STRING(res) + reslen; } if (i > 0) { memcpy(p, sep, seplen); |