summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2007-06-09 08:01:33 +0000
committerMartin v. Löwis <martin@v.loewis.de>2007-06-09 08:01:33 +0000
commit2276885acda0a74875cf02c5459c05e67b986f97 (patch)
tree2a5304e0663e66f4bae4860bf5a8e711fd529930 /Python
parent66e64e2b6a837bcd95c29a2173d065fdc91f0581 (diff)
downloadcpython-git-2276885acda0a74875cf02c5459c05e67b986f97.tar.gz
Patch #1733960: Allow T_LONGLONG to accept ints.
Diffstat (limited to 'Python')
-rw-r--r--Python/structmember.c42
1 files changed, 18 insertions, 24 deletions
diff --git a/Python/structmember.c b/Python/structmember.c
index 03934c0c84..8275589f15 100644
--- a/Python/structmember.c
+++ b/Python/structmember.c
@@ -277,31 +277,25 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
}
break;
#ifdef HAVE_LONG_LONG
- case T_LONGLONG:
- if (!PyLong_Check(v)) {
- PyErr_BadArgument();
+ case T_LONGLONG:{
+ PY_LONG_LONG value;
+ *(PY_LONG_LONG*)addr = value = PyLong_AsLongLong(v);
+ if ((value == -1) && PyErr_Occurred())
return -1;
- } else {
- PY_LONG_LONG value;
- *(PY_LONG_LONG*)addr = value = PyLong_AsLongLong(v);
- if ((value == -1) && PyErr_Occurred()) {
- return -1;
- }
- }
- break;
- case T_ULONGLONG:
- if (!PyLong_Check(v)) {
- PyErr_BadArgument();
- return -1;
- } else {
- unsigned PY_LONG_LONG value;
- *(unsigned PY_LONG_LONG*)addr = value = PyLong_AsUnsignedLongLong(v);
- if ((value == (unsigned PY_LONG_LONG)-1) &&
- PyErr_Occurred()) {
- return -1;
- }
- }
- break;
+ break;
+ }
+ case T_ULONGLONG:{
+ unsigned PY_LONG_LONG value;
+ /* ??? PyLong_AsLongLong accepts an int, but PyLong_AsUnsignedLongLong
+ doesn't ??? */
+ if (PyLong_Check(v))
+ *(unsigned PY_LONG_LONG*)addr = value = PyLong_AsUnsignedLongLong(v);
+ else
+ *(unsigned PY_LONG_LONG*)addr = value = PyInt_AsLong(v);
+ if ((value == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())
+ return -1;
+ break;
+ }
#endif /* HAVE_LONG_LONG */
default:
PyErr_Format(PyExc_SystemError,