1jtddlZddlZddlZddlmZejdZejj dZ dS)N)extbuildctjdstjdd}dg}d} ddl}|S#t $rYnwxYwtjd||tj g|| S) z Some codes to generate data and manage temporary buffers use when sharing with numpy via the array interface protocol. linuxzlink fails on cygwina$ #include #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include #include #include NPY_NO_EXPORT void delete_array_struct(PyObject *cap) { /* get the array interface structure */ PyArrayInterface *inter = (PyArrayInterface*) PyCapsule_GetPointer(cap, NULL); /* get the buffer by which data was shared */ double *ptr = (double*)PyCapsule_GetContext(cap); /* for the purposes of the regression test set the elements to nan */ for (npy_intp i = 0; i < inter->shape[0]; ++i) ptr[i] = nan(""); /* free the shared buffer */ free(ptr); /* free the array interface structure */ free(inter->shape); free(inter); fprintf(stderr, "delete_array_struct\ncap = %ld inter = %ld" " ptr = %ld\n", (long)cap, (long)inter, (long)ptr); } )new_array_struct METH_VARARGSa} long long n_elem = 0; double value = 0.0; if (!PyArg_ParseTuple(args, "Ld", &n_elem, &value)) { Py_RETURN_NONE; } /* allocate and initialize the data to share with numpy */ long long n_bytes = n_elem*sizeof(double); double *data = (double*)malloc(n_bytes); if (!data) { PyErr_Format(PyExc_MemoryError, "Failed to malloc %lld bytes", n_bytes); Py_RETURN_NONE; } for (long long i = 0; i < n_elem; ++i) { data[i] = value; } /* calculate the shape and stride */ int nd = 1; npy_intp *ss = (npy_intp*)malloc(2*nd*sizeof(npy_intp)); npy_intp *shape = ss; npy_intp *stride = ss + nd; shape[0] = n_elem; stride[0] = sizeof(double); /* construct the array interface */ PyArrayInterface *inter = (PyArrayInterface*) malloc(sizeof(PyArrayInterface)); memset(inter, 0, sizeof(PyArrayInterface)); inter->two = 2; inter->nd = nd; inter->typekind = 'f'; inter->itemsize = sizeof(double); inter->shape = shape; inter->strides = stride; inter->data = data; inter->flags = NPY_ARRAY_WRITEABLE | NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_C_CONTIGUOUS; /* package into a capsule */ PyObject *cap = PyCapsule_New(inter, NULL, delete_array_struct); /* save the pointer to the data */ PyCapsule_SetContext(cap, data); fprintf(stderr, "new_array_struct\ncap = %ld inter = %ld" " ptr = %ld\n", (long)cap, (long)inter, (long)data); return cap; zimport_array();rNarray_interface_testing)prologue include_dirs build_dir more_init) sysplatform startswithpytestskipr ImportErrorrbuild_and_import_extensionnp get_include)tmp_pathr functionsr rs y/builddir/build/BUILD/cloudlinux-venv-1.0.11/venv/lib64/python3.11/site-packages/numpy/core/tests/test_array_interface.py get_modulers < " "7 + +, *+++  HF< > I@"I &&&&&&        ./H/88@=?^=M=M.data_sourceaJ This class is for testing the timing of the PyCapsule destructor invoked when numpy release its reference to the shared data as part of the numpy array interface protocol. If the PyCapsule destructor is called early the shared data is freed and invalid memory accesses will occur. c"||_||_dSN)sizevalue)selfrr s r__init__z*test_cstruct..data_source.__init__sDIDJJJcD|j|jSr)rrr )r!rs r__array_struct__z2test_cstruct..data_source.__array_struct__s..ty$*EE Er#N)__name__ __module__ __qualname____doc__r"propertyr%)rsr data_sourcersZ       F F F F  F F Fr#r+go! gz+ ---- create an object to share data ---- z ---- OK! z8 ---- share data via the array interface protocol ---- F)copyzarr.__array_interface___ = %s zarr.base = %s z0 ---- destroy the object that shared data ---- z ---- read shared data ---- z arr = %s z ---- modify shared data ---- z& ---- read modified shared data ---- z ---- free shared data ---- ) r __stderr__writerarraystr__array_interface__baseallclose)rr+stderrexpected_value multiplierbufarrs` r test_cstructr:sFFFFFFFFFF$^FNJ LL?@@@ +c> * *C LL!!! LLLMMM (3U # # #C LL2S,--/000 LL"c#(mm4555 LL!!! LLDEEE C LL!!! ;sN + +++ +  LL1222 LLS*+++ LL!!! LL3444:Cj N LL2S,--/000 LL"c#(mm4555 LL!!! LL:;;; LLS*+++ LL!!! ;sN + +++ + LL1222 C LL!!!!!r#) r rnumpyr numpy.testingrfixturermarkslowr:r#rrAs """"""xDxDxDvT"T"T"T"T"r#