mirror of
https://github.com/python/cpython.git
synced 2025-12-09 10:37:17 +00:00
gh-132661: Disallow Template/str concatenation after PEP 750 spec update (#135996)
Co-authored-by: sobolevn <mail@sobolevn.me> Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com>
This commit is contained in:
parent
246be21de1
commit
c5e77af131
13 changed files with 2097 additions and 2133 deletions
|
|
@ -30,7 +30,8 @@ templateiter_next(PyObject *op)
|
|||
Py_SETREF(item, PyIter_Next(self->interpolationsiter));
|
||||
self->from_strings = 1;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
item = PyIter_Next(self->interpolationsiter);
|
||||
self->from_strings = 1;
|
||||
}
|
||||
|
|
@ -245,54 +246,6 @@ template_iter(PyObject *op)
|
|||
return (PyObject *)iter;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
template_strings_append_str(PyObject *strings, PyObject *str)
|
||||
{
|
||||
Py_ssize_t stringslen = PyTuple_GET_SIZE(strings);
|
||||
PyObject *string = PyTuple_GET_ITEM(strings, stringslen - 1);
|
||||
PyObject *concat = PyUnicode_Concat(string, str);
|
||||
if (concat == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *newstrings = PyTuple_New(stringslen);
|
||||
if (newstrings == NULL) {
|
||||
Py_DECREF(concat);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (Py_ssize_t i = 0; i < stringslen - 1; i++) {
|
||||
PyTuple_SET_ITEM(newstrings, i, Py_NewRef(PyTuple_GET_ITEM(strings, i)));
|
||||
}
|
||||
PyTuple_SET_ITEM(newstrings, stringslen - 1, concat);
|
||||
|
||||
return newstrings;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
template_strings_prepend_str(PyObject *strings, PyObject *str)
|
||||
{
|
||||
Py_ssize_t stringslen = PyTuple_GET_SIZE(strings);
|
||||
PyObject *string = PyTuple_GET_ITEM(strings, 0);
|
||||
PyObject *concat = PyUnicode_Concat(str, string);
|
||||
if (concat == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *newstrings = PyTuple_New(stringslen);
|
||||
if (newstrings == NULL) {
|
||||
Py_DECREF(concat);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyTuple_SET_ITEM(newstrings, 0, concat);
|
||||
for (Py_ssize_t i = 1; i < stringslen; i++) {
|
||||
PyTuple_SET_ITEM(newstrings, i, Py_NewRef(PyTuple_GET_ITEM(strings, i)));
|
||||
}
|
||||
|
||||
return newstrings;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
template_strings_concat(PyObject *left, PyObject *right)
|
||||
{
|
||||
|
|
@ -344,47 +297,17 @@ template_concat_templates(templateobject *self, templateobject *other)
|
|||
return newtemplate;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
template_concat_template_str(templateobject *self, PyObject *other)
|
||||
{
|
||||
PyObject *newstrings = template_strings_append_str(self->strings, other);
|
||||
if (newstrings == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *newtemplate = _PyTemplate_Build(newstrings, self->interpolations);
|
||||
Py_DECREF(newstrings);
|
||||
return newtemplate;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
template_concat_str_template(templateobject *self, PyObject *other)
|
||||
{
|
||||
PyObject *newstrings = template_strings_prepend_str(self->strings, other);
|
||||
if (newstrings == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *newtemplate = _PyTemplate_Build(newstrings, self->interpolations);
|
||||
Py_DECREF(newstrings);
|
||||
return newtemplate;
|
||||
}
|
||||
|
||||
PyObject *
|
||||
_PyTemplate_Concat(PyObject *self, PyObject *other)
|
||||
{
|
||||
if (_PyTemplate_CheckExact(self) && _PyTemplate_CheckExact(other)) {
|
||||
return template_concat_templates((templateobject *) self, (templateobject *) other);
|
||||
}
|
||||
else if ((_PyTemplate_CheckExact(self)) && PyUnicode_Check(other)) {
|
||||
return template_concat_template_str((templateobject *) self, other);
|
||||
}
|
||||
else if (PyUnicode_Check(self) && (_PyTemplate_CheckExact(other))) {
|
||||
return template_concat_str_template((templateobject *) other, self);
|
||||
}
|
||||
else {
|
||||
Py_RETURN_NOTIMPLEMENTED;
|
||||
}
|
||||
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"can only concatenate string.templatelib.Template (not \"%T\") to string.templatelib.Template",
|
||||
other);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
|
|||
|
|
@ -56,7 +56,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include "pycore_pyhash.h" // _Py_HashSecret_t
|
||||
#include "pycore_pylifecycle.h" // _Py_SetFileSystemEncoding()
|
||||
#include "pycore_pystate.h" // _PyInterpreterState_GET()
|
||||
#include "pycore_template.h" // _PyTemplate_Concat()
|
||||
#include "pycore_tuple.h" // _PyTuple_FromArray()
|
||||
#include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI
|
||||
#include "pycore_unicodeobject.h" // struct _Py_unicode_state
|
||||
|
|
@ -11610,16 +11609,10 @@ PyUnicode_Concat(PyObject *left, PyObject *right)
|
|||
return NULL;
|
||||
|
||||
if (!PyUnicode_Check(right)) {
|
||||
if (_PyTemplate_CheckExact(right)) {
|
||||
// str + tstring is implemented in the tstring type
|
||||
return _PyTemplate_Concat(left, right);
|
||||
}
|
||||
else {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"can only concatenate str (not \"%.200s\") to str",
|
||||
Py_TYPE(right)->tp_name);
|
||||
return NULL;
|
||||
}
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"can only concatenate str (not \"%.200s\") to str",
|
||||
Py_TYPE(right)->tp_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Shortcuts */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue