diff options
Diffstat (limited to 'Python/structmember.c')
-rw-r--r-- | Python/structmember.c | 133 |
1 files changed, 33 insertions, 100 deletions
diff --git a/Python/structmember.c b/Python/structmember.c index e347b51aac..af0296d802 100644 --- a/Python/structmember.c +++ b/Python/structmember.c @@ -5,91 +5,42 @@ #include "structmember.h" -static PyObject * -listmembers(struct memberlist *mlist) -{ - int i, n; - PyObject *v; - for (n = 0; mlist[n].name != NULL; n++) - ; - v = PyList_New(n); - if (v != NULL) { - for (i = 0; i < n; i++) - PyList_SetItem(v, i, - PyString_FromString(mlist[i].name)); - if (PyErr_Occurred()) { - Py_DECREF(v); - v = NULL; - } - else { - PyList_Sort(v); - } - } - return v; -} - -PyObject * -PyMember_Get(const char *addr, struct memberlist *mlist, const char *name) -{ - struct memberlist *l; - - if (strcmp(name, "__members__") == 0) - return listmembers(mlist); - for (l = mlist; l->name != NULL; l++) { - if (strcmp(l->name, name) == 0) { - PyMemberDef copy; - copy.name = l->name; - copy.type = l->type; - copy.offset = l->offset; - copy.flags = l->flags; - copy.doc = NULL; - return PyMember_GetOne(addr, ©); - } - } - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - PyObject * PyMember_GetOne(const char *addr, PyMemberDef *l) { PyObject *v; - if ((l->flags & READ_RESTRICTED) && - PyEval_GetRestricted()) { - PyErr_SetString(PyExc_RuntimeError, "restricted attribute"); - return NULL; - } + addr += l->offset; switch (l->type) { case T_BOOL: v = PyBool_FromLong(*(char*)addr); break; case T_BYTE: - v = PyInt_FromLong(*(char*)addr); + v = PyLong_FromLong(*(char*)addr); break; case T_UBYTE: v = PyLong_FromUnsignedLong(*(unsigned char*)addr); break; case T_SHORT: - v = PyInt_FromLong(*(short*)addr); + v = PyLong_FromLong(*(short*)addr); break; case T_USHORT: v = PyLong_FromUnsignedLong(*(unsigned short*)addr); break; case T_INT: - v = PyInt_FromLong(*(int*)addr); + v = PyLong_FromLong(*(int*)addr); break; case T_UINT: v = PyLong_FromUnsignedLong(*(unsigned int*)addr); break; case T_LONG: - v = PyInt_FromLong(*(long*)addr); + v = PyLong_FromLong(*(long*)addr); break; case T_ULONG: v = PyLong_FromUnsignedLong(*(unsigned long*)addr); break; case T_PYSSIZET: - v = PyInt_FromSsize_t(*(Py_ssize_t*)addr); + v = PyLong_FromSsize_t(*(Py_ssize_t*)addr); break; case T_FLOAT: v = PyFloat_FromDouble((double)*(float*)addr); @@ -103,13 +54,13 @@ PyMember_GetOne(const char *addr, PyMemberDef *l) v = Py_None; } else - v = PyString_FromString(*(char**)addr); + v = PyUnicode_FromString(*(char**)addr); break; case T_STRING_INPLACE: - v = PyString_FromString((char*)addr); + v = PyUnicode_FromString((char*)addr); break; case T_CHAR: - v = PyString_FromStringAndSize((char*)addr, 1); + v = PyUnicode_FromStringAndSize((char*)addr, 1); break; case T_OBJECT: v = *(PyObject **)addr; @@ -131,6 +82,10 @@ PyMember_GetOne(const char *addr, PyMemberDef *l) v = PyLong_FromUnsignedLongLong(*(unsigned PY_LONG_LONG *)addr); break; #endif /* HAVE_LONG_LONG */ + case T_NONE: + v = Py_None; + Py_INCREF(v); + break; default: PyErr_SetString(PyExc_SystemError, "bad memberdescr type"); v = NULL; @@ -138,31 +93,10 @@ PyMember_GetOne(const char *addr, PyMemberDef *l) return v; } -int -PyMember_Set(char *addr, struct memberlist *mlist, const char *name, PyObject *v) -{ - struct memberlist *l; - - for (l = mlist; l->name != NULL; l++) { - if (strcmp(l->name, name) == 0) { - PyMemberDef copy; - copy.name = l->name; - copy.type = l->type; - copy.offset = l->offset; - copy.flags = l->flags; - copy.doc = NULL; - return PyMember_SetOne(addr, ©, v); - } - } - - PyErr_SetString(PyExc_AttributeError, name); - return -1; -} - -#define WARN(msg) \ - do { \ - if (PyErr_Warn(PyExc_RuntimeWarning, msg) < 0) \ - return -1; \ +#define WARN(msg) \ + do { \ + if (PyErr_WarnEx(PyExc_RuntimeWarning, msg, 1) < 0) \ + return -1; \ } while (0) int @@ -174,11 +108,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) if ((l->flags & READONLY)) { - PyErr_SetString(PyExc_TypeError, "readonly attribute"); - return -1; - } - if ((l->flags & PY_WRITE_RESTRICTED) && PyEval_GetRestricted()) { - PyErr_SetString(PyExc_RuntimeError, "restricted attribute"); + PyErr_SetString(PyExc_AttributeError, "readonly attribute"); return -1; } if (v == NULL) { @@ -209,7 +139,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) break; } case T_BYTE:{ - long long_val = PyInt_AsLong(v); + long long_val = PyLong_AsLong(v); if ((long_val == -1) && PyErr_Occurred()) return -1; *(char*)addr = (char)long_val; @@ -220,7 +150,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) break; } case T_UBYTE:{ - long long_val = PyInt_AsLong(v); + long long_val = PyLong_AsLong(v); if ((long_val == -1) && PyErr_Occurred()) return -1; *(unsigned char*)addr = (unsigned char)long_val; @@ -229,7 +159,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) break; } case T_SHORT:{ - long long_val = PyInt_AsLong(v); + long long_val = PyLong_AsLong(v); if ((long_val == -1) && PyErr_Occurred()) return -1; *(short*)addr = (short)long_val; @@ -238,7 +168,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) break; } case T_USHORT:{ - long long_val = PyInt_AsLong(v); + long long_val = PyLong_AsLong(v); if ((long_val == -1) && PyErr_Occurred()) return -1; *(unsigned short*)addr = (unsigned short)long_val; @@ -247,7 +177,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) break; } case T_INT:{ - long long_val = PyInt_AsLong(v); + long long_val = PyLong_AsLong(v); if ((long_val == -1) && PyErr_Occurred()) return -1; *(int *)addr = (int)long_val; @@ -295,7 +225,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) break; } case T_PYSSIZET:{ - *(Py_ssize_t*)addr = PyInt_AsSsize_t(v); + *(Py_ssize_t*)addr = PyLong_AsSsize_t(v); if ((*(Py_ssize_t*)addr == (Py_ssize_t)-1) && PyErr_Occurred()) return -1; @@ -320,15 +250,18 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) *(PyObject **)addr = v; Py_XDECREF(oldv); break; - case T_CHAR: - if (PyString_Check(v) && PyString_Size(v) == 1) { - *(char*)addr = PyString_AsString(v)[0]; - } - else { + case T_CHAR: { + char *string; + Py_ssize_t len; + + string = _PyUnicode_AsStringAndSize(v, &len); + if (string == NULL || len != 1) { PyErr_BadArgument(); return -1; } + *(char*)addr = string[0]; break; + } case T_STRING: case T_STRING_INPLACE: PyErr_SetString(PyExc_TypeError, "readonly attribute"); @@ -348,7 +281,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) if (PyLong_Check(v)) *(unsigned PY_LONG_LONG*)addr = value = PyLong_AsUnsignedLongLong(v); else - *(unsigned PY_LONG_LONG*)addr = value = PyInt_AsLong(v); + *(unsigned PY_LONG_LONG*)addr = value = PyLong_AsLong(v); if ((value == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred()) return -1; break; |