[pypy-commit] pypy default: test, implement PyUnicode_FromFormat in C
mattip
pypy.commits at gmail.com
Mon Sep 11 11:45:20 EDT 2017
Author: Matti Picus <matti.picus at 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
- at 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
-
- at 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
More information about the pypy-commit
mailing list