diff options
author | Fred Drake <fdrake@acm.org> | 2000-04-13 14:10:44 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2000-04-13 14:10:44 (GMT) |
commit | 4e998bc6589790e08c327449c6b2864a7f9c6b5b (patch) | |
tree | 7448f74a23d873ace3d9d4ee67f74ddcbba14917 /Python/compile.c | |
parent | afe73a4687622c13246475559c6fccde2594e9f4 (diff) | |
download | cpython-4e998bc6589790e08c327449c6b2864a7f9c6b5b.zip cpython-4e998bc6589790e08c327449c6b2864a7f9c6b5b.tar.gz cpython-4e998bc6589790e08c327449c6b2864a7f9c6b5b.tar.bz2 |
M.-A. Lemburg <mal@lemburg.com>:
Fixed problem with Unicode string concatenation:
u = (u"abc" u"abc") previously dumped core.
Diffstat (limited to 'Python/compile.c')
-rw-r--r-- | Python/compile.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/Python/compile.c b/Python/compile.c index 97ab99c..453aae3 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -984,11 +984,32 @@ parsestrplus(n) REQ(CHILD(n, 0), STRING); if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) { /* String literal concatenation */ - for (i = 1; i < NCH(n) && v != NULL; i++) { - PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i)))); + for (i = 1; i < NCH(n); i++) { + PyObject *s; + s = parsestr(STR(CHILD(n, i))); + if (s == NULL) + goto onError; + if (PyString_Check(v) && PyString_Check(s)) { + PyString_ConcatAndDel(&v, s); + if (v == NULL) + goto onError; + } + else { + PyObject *temp; + temp = PyUnicode_Concat(v, s); + Py_DECREF(s); + if (temp == NULL) + goto onError; + Py_DECREF(v); + v = temp; + } } } return v; + + onError: + Py_XDECREF(v); + return NULL; } static void |