From: Martin v. Löwis Date: Fri, 15 Mar 2002 13:40:30 +0000 (+0000) Subject: Patch #517521: Consider byte strings before Unicode strings X-Git-Tag: v2.3c1~6488 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0c160a08f2228045437a94ea6e00306ace8dbfb4;p=python Patch #517521: Consider byte strings before Unicode strings in PyObject_Get/SetAttr. --- diff --git a/Objects/object.c b/Objects/object.c index bcc129cd5c..26ddd13671 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1085,21 +1085,23 @@ PyObject_GetAttr(PyObject *v, PyObject *name) { PyTypeObject *tp = v->ob_type; + if (!PyString_Check(name)) { #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_getattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = _PyUnicode_AsDefaultEncodedString(name, NULL); - if (name == NULL) - return NULL; - } - else + /* The Unicode to string conversion is done here because the + existing tp_getattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = _PyUnicode_AsDefaultEncodedString(name, NULL); + if (name == NULL) + return NULL; + } + else #endif - if (!PyString_Check(name)) { - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return NULL; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return NULL; + } } if (tp->tp_getattro != NULL) return (*tp->tp_getattro)(v, name); @@ -1129,21 +1131,23 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) PyTypeObject *tp = v->ob_type; int err; + if (!PyString_Check(name)){ #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) - return -1; - } - else + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) + return -1; + } + else #endif - if (!PyString_Check(name)){ - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return -1; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return -1; + } } else Py_INCREF(name); @@ -1217,21 +1221,23 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name) descrgetfunc f; PyObject **dictptr; + if (!PyString_Check(name)){ #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) - return NULL; - } - else + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) + return NULL; + } + else #endif - if (!PyString_Check(name)){ - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return NULL; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return NULL; + } } else Py_INCREF(name); @@ -1291,21 +1297,23 @@ PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value) PyObject **dictptr; int res = -1; + if (!PyString_Check(name)){ #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) - return -1; - } - else + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) + return -1; + } + else #endif - if (!PyString_Check(name)){ - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return -1; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return -1; + } } else Py_INCREF(name);