aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Python/structmember.c
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2024-02-12 07:53:52 +0300
committerDaniil Cherednik <dcherednik@ydb.tech>2024-02-14 14:26:16 +0000
commit31f2a419764a8ba77c2a970cfc80056c6cd06756 (patch)
treec1995d239eba8571cefc640f6648e1d5dd4ce9e2 /contrib/tools/python3/src/Python/structmember.c
parentfe2ef02b38d9c85d80060963b265a1df9f38c3bb (diff)
downloadydb-31f2a419764a8ba77c2a970cfc80056c6cd06756.tar.gz
Update Python from 3.11.8 to 3.12.2
Diffstat (limited to 'contrib/tools/python3/src/Python/structmember.c')
-rw-r--r--contrib/tools/python3/src/Python/structmember.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/contrib/tools/python3/src/Python/structmember.c b/contrib/tools/python3/src/Python/structmember.c
index c790656978..ebebaa0a03 100644
--- a/contrib/tools/python3/src/Python/structmember.c
+++ b/contrib/tools/python3/src/Python/structmember.c
@@ -8,6 +8,12 @@ PyObject *
PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
{
PyObject *v;
+ if (l->flags & Py_RELATIVE_OFFSET) {
+ PyErr_SetString(
+ PyExc_SystemError,
+ "PyMember_GetOne used with Py_RELATIVE_OFFSET");
+ return NULL;
+ }
const char* addr = obj_addr + l->offset;
switch (l->type) {
@@ -49,8 +55,7 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
break;
case T_STRING:
if (*(char**)addr == NULL) {
- Py_INCREF(Py_None);
- v = Py_None;
+ v = Py_NewRef(Py_None);
}
else
v = PyUnicode_FromString(*(char**)addr);
@@ -75,7 +80,7 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
PyErr_Format(PyExc_AttributeError,
"'%.200s' object has no attribute '%s'",
tp->tp_name, l->name);
- }
+ }
Py_XINCREF(v);
break;
case T_LONGLONG:
@@ -85,8 +90,7 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
v = PyLong_FromUnsignedLongLong(*(unsigned long long *)addr);
break;
case T_NONE:
- v = Py_None;
- Py_INCREF(v);
+ v = Py_NewRef(Py_None);
break;
default:
PyErr_SetString(PyExc_SystemError, "bad memberdescr type");
@@ -105,6 +109,12 @@ int
PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
{
PyObject *oldv;
+ if (l->flags & Py_RELATIVE_OFFSET) {
+ PyErr_SetString(
+ PyExc_SystemError,
+ "PyMember_SetOne used with Py_RELATIVE_OFFSET");
+ return -1;
+ }
addr += l->offset;
@@ -276,9 +286,8 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
break;
case T_OBJECT:
case T_OBJECT_EX:
- Py_XINCREF(v);
oldv = *(PyObject **)addr;
- *(PyObject **)addr = v;
+ *(PyObject **)addr = Py_XNewRef(v);
Py_XDECREF(oldv);
break;
case T_CHAR: {