]> granicus.if.org Git - python/commitdiff
bpo-16865: Support arrays >=2GB in ctypes. (GH-3006)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 15 May 2018 05:55:52 +0000 (22:55 -0700)
committerGitHub <noreply@github.com>
Tue, 15 May 2018 05:55:52 +0000 (22:55 -0700)
(cherry picked from commit 735abadd5bd91db4a9e6f4311969b0afacca0a1a)

Co-authored-by: Segev Finer <segev208@gmail.com>
Lib/ctypes/test/test_arrays.py
Misc/NEWS.d/next/Library/2017-09-29-16-40-38.bpo-16865.l-f6I_.rst [new file with mode: 0644]
Modules/_ctypes/_ctypes.c

index 4ed566b48e67e8824a6cb1a62bdb7eb2309a97c3..6e562cfd24e6638c813188b83be6c408caeeead9 100644 (file)
@@ -1,4 +1,6 @@
 import unittest
+from test.support import bigmemtest, _2G
+import sys
 from ctypes import *
 
 from ctypes.test import need_symbol
@@ -181,5 +183,10 @@ class ArrayTestCase(unittest.TestCase):
                 _type_ = c_int
                 _length_ = 1.87
 
+    @unittest.skipUnless(sys.maxsize > 2**32, 'requires 64bit platform')
+    @bigmemtest(size=_2G, memuse=1, dry_run=False)
+    def test_large_array(self, size):
+        c_char * size
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2017-09-29-16-40-38.bpo-16865.l-f6I_.rst b/Misc/NEWS.d/next/Library/2017-09-29-16-40-38.bpo-16865.l-f6I_.rst
new file mode 100644 (file)
index 0000000..afaff73
--- /dev/null
@@ -0,0 +1 @@
+Support arrays >=2GiB in :mod:`ctypes`.  Patch by Segev Finer.
index 2c0a769d87247aca781c0de7f45bbb8380788a92..69d73f5a958f0e2c9bbc197882c8ab1a98614622 100644 (file)
@@ -1392,8 +1392,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     StgDictObject *stgdict;
     StgDictObject *itemdict;
     PyObject *length_attr, *type_attr;
-    long length;
-    int overflow;
+    Py_ssize_t length;
     Py_ssize_t itemsize, itemalign;
 
     /* create the new instance (which is a class,
@@ -1415,14 +1414,15 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_XDECREF(length_attr);
         goto error;
     }
-    length = PyLong_AsLongAndOverflow(length_attr, &overflow);
-    if (overflow) {
-        PyErr_SetString(PyExc_OverflowError,
-                        "The '_length_' attribute is too large");
-        Py_DECREF(length_attr);
+    length = PyLong_AsSsize_t(length_attr);
+    Py_DECREF(length_attr);
+    if (length == -1 && PyErr_Occurred()) {
+        if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "The '_length_' attribute is too large");
+        }
         goto error;
     }
-    Py_DECREF(length_attr);
 
     type_attr = PyObject_GetAttrString((PyObject *)result, "_type_");
     if (!type_attr) {