summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/stringobject.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index ec7eb90..dbade8c 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -2666,7 +2666,7 @@ PyString_Format(PyObject *format, PyObject *args)
char *fmt, *res;
int fmtcnt, rescnt, reslen, arglen, argidx;
int args_owned = 0;
- PyObject *result, *orig_args;
+ PyObject *result, *orig_args, *v, *w;
PyObject *dict = NULL;
if (format == NULL || !PyString_Check(format) || args == NULL) {
PyErr_BadInternalCall();
@@ -3055,22 +3055,28 @@ PyString_Format(PyObject *format, PyObject *args)
Py_INCREF(orig_args);
args = orig_args;
}
- /* Paste rest of format string to what we have of the result
- string; we reuse result for this */
+ args_owned = 1;
+ /* Take what we have of the result and let the Unicode formatting
+ function format the rest of the input. */
rescnt = res - PyString_AS_STRING(result);
+ if (_PyString_Resize(&result, rescnt))
+ goto error;
fmtcnt = PyString_GET_SIZE(format) - \
(fmt - PyString_AS_STRING(format));
- if (_PyString_Resize(&result, rescnt + fmtcnt)) {
- Py_DECREF(args);
+ format = PyUnicode_Decode(fmt, fmtcnt, NULL, NULL);
+ if (format == NULL)
goto error;
- }
- memcpy(PyString_AS_STRING(result) + rescnt, fmt, fmtcnt);
- format = result;
- /* Let Unicode do its magic */
- result = PyUnicode_Format(format, args);
+ v = PyUnicode_Format(format, args);
Py_DECREF(format);
+ if (v == NULL)
+ goto error;
+ /* Paste what we have (result) to what the Unicode formatting
+ function returned (v) and return the result (or error) */
+ w = PyUnicode_Concat(result, v);
+ Py_DECREF(result);
+ Py_DECREF(v);
Py_DECREF(args);
- return result;
+ return w;
error:
Py_DECREF(result);