summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMartijn Pieters <github.com@zopatista.com>2017-02-23 13:38:04 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2017-02-23 13:38:04 (GMT)
commitd7e64337ef45085792b382a09f5b3a45d3687c8c (patch)
treee564cb5e7c44b866630e0de6550b6862f82a3a68 /Python
parent2771304357607aa62801a67acc1e3c7c8ec489ce (diff)
downloadcpython-d7e64337ef45085792b382a09f5b3a45d3687c8c.zip
cpython-d7e64337ef45085792b382a09f5b3a45d3687c8c.tar.gz
cpython-d7e64337ef45085792b382a09f5b3a45d3687c8c.tar.bz2
bpo-28598: Support __rmod__ for RHS subclasses of str in % string formatting operations (#51)
When you use `'%s' % SubClassOfStr()`, where `SubClassOfStr.__rmod__` exists, the reverse operation is ignored as normally such string formatting operations use the `PyUnicode_Format()` fast path. This patch tests for subclasses of `str` first and picks the slow path in that case. Patch by Martijn Pieters.
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 81c89df..0a82965 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1354,9 +1354,15 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
TARGET(BINARY_MODULO) {
PyObject *divisor = POP();
PyObject *dividend = TOP();
- PyObject *res = PyUnicode_CheckExact(dividend) ?
- PyUnicode_Format(dividend, divisor) :
- PyNumber_Remainder(dividend, divisor);
+ PyObject *res;
+ if (PyUnicode_CheckExact(dividend) && (
+ !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
+ // fast path; string formatting, but not if the RHS is a str subclass
+ // (see issue28598)
+ res = PyUnicode_Format(dividend, divisor);
+ } else {
+ res = PyNumber_Remainder(dividend, divisor);
+ }
Py_DECREF(divisor);
Py_DECREF(dividend);
SET_TOP(res);