Author: Matti Picus <matti.pi...@gmail.com> Branch: Changeset: r92367:e3a231de06fb Date: 2017-09-09 23:55 +0300 http://bitbucket.org/pypy/pypy/changeset/e3a231de06fb/
Log: test, implement PyUnicode_FromFormat in C diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -540,6 +540,7 @@ 'PyArg_ParseTuple', 'PyArg_UnpackTuple', 'PyArg_ParseTupleAndKeywords', 'PyArg_VaParse', 'PyArg_VaParseTupleAndKeywords', '_PyArg_NoKeywords', 'PyString_FromFormat', 'PyString_FromFormatV', + 'PyUnicode_FromFormat', 'PyUnicode_FromFormatV', 'PyModule_AddObject', 'PyModule_AddIntConstant', 'PyModule_AddStringConstant', 'Py_BuildValue', 'Py_VaBuildValue', 'PyTuple_Pack', '_PyArg_Parse_SizeT', '_PyArg_ParseTuple_SizeT', @@ -1340,6 +1341,7 @@ source_dir / "getargs.c", source_dir / "abstract.c", source_dir / "stringobject.c", + source_dir / "unicodeobject.c", source_dir / "mysnprintf.c", source_dir / "pythonrun.c", source_dir / "sysmodule.c", diff --git a/pypy/module/cpyext/include/unicodeobject.h b/pypy/module/cpyext/include/unicodeobject.h --- a/pypy/module/cpyext/include/unicodeobject.h +++ b/pypy/module/cpyext/include/unicodeobject.h @@ -7,6 +7,9 @@ #include "cpyext_unicodeobject.h" +PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV(const char *format, va_list vargs); +PyAPI_FUNC(PyObject *) PyUnicode_FromFormat(const char *format, ...); + #define PyUnicode_Check(op) \ PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_UNICODE_SUBCLASS) #define PyUnicode_CheckExact(op) ((op)->ob_type == &PyUnicode_Type) diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py --- a/pypy/module/cpyext/stubs.py +++ b/pypy/module/cpyext/stubs.py @@ -1500,151 +1500,6 @@ """ raise NotImplementedError -@cpython_api([rffi.CCHARP], PyObject) -def PyUnicode_FromFormat(space, format): - """Take a C printf()-style format string and a variable number of - arguments, calculate the size of the resulting Python unicode string and return - a string with the values formatted into it. The variable arguments must be C - types and must correspond exactly to the format characters in the format - string. The following format characters are allowed: - - Format Characters - - Type - - Comment - - %% - - n/a - - The literal % character. - - %c - - int - - A single character, - represented as an C int. - - %d - - int - - Exactly equivalent to - printf("%d"). - - %u - - unsigned int - - Exactly equivalent to - printf("%u"). - - %ld - - long - - Exactly equivalent to - printf("%ld"). - - %lu - - unsigned long - - Exactly equivalent to - printf("%lu"). - - %zd - - Py_ssize_t - - Exactly equivalent to - printf("%zd"). - - %zu - - size_t - - Exactly equivalent to - printf("%zu"). - - %i - - int - - Exactly equivalent to - printf("%i"). - - %x - - int - - Exactly equivalent to - printf("%x"). - - %s - - char* - - A null-terminated C character - array. - - %p - - void* - - The hex representation of a C - pointer. Mostly equivalent to - printf("%p") except that - it is guaranteed to start with - the literal 0x regardless - of what the platform's - printf yields. - - %U - - PyObject* - - A unicode object. - - %V - - PyObject*, char * - - A unicode object (which may be - NULL) and a null-terminated - C character array as a second - parameter (which will be used, - if the first parameter is - NULL). - - %S - - PyObject* - - The result of calling - PyObject_Unicode(). - - %R - - PyObject* - - The result of calling - PyObject_Repr(). - - An unrecognized format character causes all the rest of the format string to be - copied as-is to the result string, and any extra arguments discarded. - """ - raise NotImplementedError - -@cpython_api([rffi.CCHARP, va_list], PyObject) -def PyUnicode_FromFormatV(space, format, vargs): - """Identical to PyUnicode_FromFormat() except that it takes exactly two - arguments. - """ - raise NotImplementedError - @cpython_api([rffi.CWCHARP, Py_ssize_t, rffi.CCHARP, rffi.CCHARP], PyObject) def PyUnicode_Encode(space, s, size, encoding, errors): """Encode the Py_UNICODE buffer of the given size and return a Python diff --git a/pypy/module/cpyext/test/test_unicodeobject.py b/pypy/module/cpyext/test/test_unicodeobject.py --- a/pypy/module/cpyext/test/test_unicodeobject.py +++ b/pypy/module/cpyext/test/test_unicodeobject.py @@ -132,6 +132,20 @@ """)]) assert module.test_macro_invocations() == u'' + def test_format(self): + module = self.import_extension('foo', [ + ("test_unicode_format", "METH_VARARGS", + ''' + return PyUnicode_FromFormat("bla %d ble %s\\n", + PyInt_AsLong(PyTuple_GetItem(args, 0)), + PyString_AsString(PyTuple_GetItem(args, 1))); + ''' + ) + ]) + res = module.test_unicode_format(1, "xyz") + assert res == u"bla 1 ble xyz\n" + + class TestUnicode(BaseApiTest): def test_unicodeobject(self, space): assert PyUnicode_GET_SIZE(space, space.wrap(u'sp�m')) == 4 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit