]> granicus.if.org Git - python/commitdiff
Patch #1115086: support PY_LONGLONG in structmember.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 3 Mar 2005 23:00:26 +0000 (23:00 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 3 Mar 2005 23:00:26 +0000 (23:00 +0000)
Include/structmember.h
Misc/NEWS
Python/structmember.c

index 015ca19c85cdefcb69967b1d45bff8232a783f7c..96d2331b044b475aa456e6a811799f73cfc0a283 100644 (file)
@@ -65,6 +65,10 @@ typedef struct PyMemberDef {
 #define T_OBJECT_EX    16      /* Like T_OBJECT, but raises AttributeError
                                   when the value is NULL, instead of
                                   converting to None. */
+#ifdef HAVE_LONG_LONG
+#define T_LONGLONG      17  
+#define T_ULONGLONG      18
+#endif /* HAVE_LONG_LONG */
 
 /* Flags */
 #define READONLY       1
index 5bf2e513fa67cf5e0b72d675268b335c88ad3a93..c6033dec31abb0ebda669a5e6c012799ac8512b1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ What's New in Python 2.5 alpha 1?
 Core and builtins
 -----------------
 
+- Patch #1115086: Support PY_LONGLONG in structmember.
+
 - Bug #1155938: new style classes did not check that __init__() was
   returning None.
 
index bbaaca81367b0076e7ee2603372205628e791cdd..1574c95cf8a93f0e4eaef5711fd5958410d3d51d 100644 (file)
@@ -118,6 +118,14 @@ PyMember_GetOne(char *addr, PyMemberDef *l)
                        PyErr_SetString(PyExc_AttributeError, l->name);
                Py_XINCREF(v);
                break;
+#ifdef HAVE_LONG_LONG
+       case T_LONGLONG:
+               v = PyLong_FromLongLong(*(PY_LONG_LONG *)addr);
+               break;
+       case T_ULONGLONG:
+               v = PyLong_FromUnsignedLongLong(*(unsigned PY_LONG_LONG *)addr);
+               break;
+#endif /* HAVE_LONG_LONG */
        default:
                PyErr_SetString(PyExc_SystemError, "bad memberdescr type");
                v = NULL;
@@ -246,6 +254,30 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
                        return -1;
                }
                break;
+#ifdef HAVE_LONG_LONG
+       case T_LONGLONG:
+               if (!PyLong_Check(v)) {
+                       PyErr_BadArgument();
+                       return -1;
+               } else {
+                        *(PY_LONG_LONG*)addr = PyLong_AsLongLong(v);
+                        if ((*addr == -1) && PyErr_Occurred()) {
+                                return -1;
+                        }
+                }
+                break;
+       case T_ULONGLONG:
+                if (!PyLong_Check(v)) {
+                        PyErr_BadArgument();
+                        return -1;
+                } else {
+                        *(unsigned PY_LONG_LONG*)addr = PyLong_AsUnsignedLongLong(v);
+                        if ((*addr == -1) && PyErr_Occurred()) {
+                                return -1;
+                        }
+                }
+                break;
+#endif /* HAVE_LONG_LONG */
        default:
                PyErr_Format(PyExc_SystemError,
                             "bad memberdescr type for %s", l->name);