diff options
author | Eric Smith <eric@trueblade.com> | 2008-05-30 18:10:04 (GMT) |
---|---|---|
committer | Eric Smith <eric@trueblade.com> | 2008-05-30 18:10:04 (GMT) |
commit | dc13b79a384691ed966f760a58d73a1b835e7d6b (patch) | |
tree | 40aa36feea2e0ee23f41801a8959990914e3fc71 /Objects/unicodeobject.c | |
parent | 30fadc17990baf4005081d2cdcb8d3adc9c45a7a (diff) | |
download | cpython-dc13b79a384691ed966f760a58d73a1b835e7d6b.zip cpython-dc13b79a384691ed966f760a58d73a1b835e7d6b.tar.gz cpython-dc13b79a384691ed966f760a58d73a1b835e7d6b.tar.bz2 |
Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 81b6a66..3ffe99c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -42,8 +42,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "formatter_unicode.h" - #include "unicodeobject.h" #include "ucnhash.h" @@ -7863,6 +7861,35 @@ PyDoc_STRVAR(format__doc__, \n\ "); +static PyObject * +unicode__format__(PyObject *self, PyObject *args) +{ + PyObject *format_spec; + PyObject *result = NULL; + PyObject *tmp = NULL; + + /* If 2.x, convert format_spec to the same type as value */ + /* This is to allow things like u''.format('') */ + if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) + goto done; + if (!(PyBytes_Check(format_spec) || PyUnicode_Check(format_spec))) { + PyErr_Format(PyExc_TypeError, "__format__ arg must be str " + "or unicode, not %s", Py_TYPE(format_spec)->tp_name); + goto done; + } + tmp = PyObject_Unicode(format_spec); + if (tmp == NULL) + goto done; + format_spec = tmp; + + result = _PyUnicode_FormatAdvanced(self, + PyUnicode_AS_UNICODE(format_spec), + PyUnicode_GET_SIZE(format_spec)); +done: + Py_XDECREF(tmp); + return result; +} + PyDoc_STRVAR(p_format__doc__, "S.__format__(format_spec) -> unicode\n\ \n\ |