diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2012-10-06 21:03:36 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2012-10-06 21:03:36 (GMT) |
commit | e215d960be3c5e1457920c452dc8f94ebf42b159 (patch) | |
tree | 6a48506e8fbe03543c0c258aab982c6a6af8558d /Include | |
parent | 2a09b6e84955779dbc878c5a0679c41d84f5d021 (diff) | |
download | cpython-e215d960be3c5e1457920c452dc8f94ebf42b159.zip cpython-e215d960be3c5e1457920c452dc8f94ebf42b159.tar.gz cpython-e215d960be3c5e1457920c452dc8f94ebf42b159.tar.bz2 |
Issue #16147: Rewrite PyUnicode_FromFormatV() to use _PyUnicodeWriter API
* Simplify the code: replace 4 steps with one unique step using the
_PyUnicodeWriter API. PyUnicode_Format() has the same design. It avoids to
store intermediate results which require to allocate an array of pointers on
the heap.
* Use the _PyUnicodeWriter API for speed (and its convinient API):
overallocate the buffer to reduce the number of "realloc()"
* Implement "width" and "precision" in Python, don't rely on sprintf(). It
avoids to need of a temporary buffer allocated on the heap: only use a small
buffer allocated in the stack.
* Add _PyUnicodeWriter_WriteCstr() function
* Split PyUnicode_FromFormatV() into two functions: add
unicode_fromformat_arg().
* Inline parse_format_flags(): the format of an argument is now only parsed
once, it's no more needed to have a subfunction.
* Optimize PyUnicode_FromFormatV() for characters between two "%" arguments:
search the next "%" and copy the substring in one chunk, instead of copying
character per character.
Diffstat (limited to 'Include')
-rw-r--r-- | Include/unicodeobject.h | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 4152dd7..fa21c1c 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -933,12 +933,28 @@ PyAPI_FUNC(int) _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, Py_ssize_t length, Py_UCS4 maxchar); +/* Append a Unicode string. + Return 0 on success, raise an exception and return -1 on error. */ PyAPI_FUNC(int) -_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str); +_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, + PyObject *str /* Unicode string */ + ); +/* Append a latin1-encoded byte string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteCstr(_PyUnicodeWriter *writer, + const char *str, /* latin1-encoded byte string */ + Py_ssize_t len /* length in bytes */ + ); + +/* Get the value of the write as an Unicode string. Clear the + buffer of the writer. Raise an exception and return NULL + on error. */ PyAPI_FUNC(PyObject *) _PyUnicodeWriter_Finish(_PyUnicodeWriter *writer); +/* Deallocate memory of a writer (clear its internal buffer). */ PyAPI_FUNC(void) _PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer); #endif |