362
362
return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
366
PyObject_ReleaseBuffer(PyObject *obj, Py_buffer *view)
368
if (obj->ob_type->tp_as_buffer != NULL &&
369
obj->ob_type->tp_as_buffer->bf_releasebuffer != NULL) {
370
(*(obj->ob_type->tp_as_buffer->bf_releasebuffer))(obj, view);
376
366
_IsFortranContiguous(Py_buffer *view)
604
594
if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
605
595
if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
606
PyObject_ReleaseBuffer(dest, &view_dest);
596
PyBuffer_Release(&view_dest);
610
600
if (view_dest.len < view_src.len) {
611
601
PyErr_SetString(PyExc_BufferError,
612
602
"destination is too small to receive data from source");
613
PyObject_ReleaseBuffer(dest, &view_dest);
614
PyObject_ReleaseBuffer(src, &view_src);
603
PyBuffer_Release(&view_dest);
604
PyBuffer_Release(&view_src);
621
611
PyBuffer_IsContiguous(&view_src, 'F'))) {
622
612
/* simplest copy is all that is needed */
623
613
memcpy(view_dest.buf, view_src.buf, view_src.len);
624
PyObject_ReleaseBuffer(dest, &view_dest);
625
PyObject_ReleaseBuffer(src, &view_src);
614
PyBuffer_Release(&view_dest);
615
PyBuffer_Release(&view_src);
632
622
indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
633
623
if (indices == NULL) {
634
624
PyErr_NoMemory();
635
PyObject_ReleaseBuffer(dest, &view_dest);
636
PyObject_ReleaseBuffer(src, &view_src);
625
PyBuffer_Release(&view_dest);
626
PyBuffer_Release(&view_src);
639
629
for (k=0; k<view_src.ndim;k++) {
651
641
memcpy(dptr, sptr, view_src.itemsize);
653
643
PyMem_Free(indices);
654
PyObject_ReleaseBuffer(dest, &view_dest);
655
PyObject_ReleaseBuffer(src, &view_src);
644
PyBuffer_Release(&view_dest);
645
PyBuffer_Release(&view_src);
684
PyBuffer_FillInfo(Py_buffer *view, void *buf, Py_ssize_t len,
674
PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
685
675
int readonly, int flags)
687
677
if (view == NULL) return 0;
708
PyBuffer_Release(Py_buffer *view)
710
PyObject *obj = view->obj;
711
if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
712
Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
715
718
PyObject_Format(PyObject* obj, PyObject *format_spec)
2776
2779
abstract_issubclass(PyObject *derived, PyObject *cls)
2781
PyObject *bases = NULL;
2779
2782
Py_ssize_t i, n;
2786
if (PyTuple_Check(cls)) {
2787
/* Not a general sequence -- that opens up the road to
2788
recursion and stack overflow. */
2789
n = PyTuple_GET_SIZE(cls);
2788
bases = abstract_get_bases(derived);
2789
if (bases == NULL) {
2790
if (PyErr_Occurred())
2794
n = PyTuple_GET_SIZE(bases);
2799
/* Avoid recursivity in the single inheritance case */
2801
derived = PyTuple_GET_ITEM(bases, 0);
2790
2805
for (i = 0; i < n; i++) {
2791
if (derived == PyTuple_GET_ITEM(cls, i))
2806
r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2795
bases = abstract_get_bases(derived);
2796
if (bases == NULL) {
2797
if (PyErr_Occurred())
2801
n = PyTuple_GET_SIZE(bases);
2802
for (i = 0; i < n; i++) {
2803
r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2828
recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
2830
recursive_isinstance(PyObject *inst, PyObject *cls)
2830
2832
PyObject *icls;
2831
2833
static PyObject *__class__ = NULL;
2862
else if (PyTuple_Check(cls)) {
2865
if (!recursion_depth) {
2866
PyErr_SetString(PyExc_RuntimeError,
2867
"nest level of tuple too deep");
2871
n = PyTuple_GET_SIZE(cls);
2872
for (i = 0; i < n; i++) {
2873
retval = recursive_isinstance(
2875
PyTuple_GET_ITEM(cls, i),
2882
2865
if (!check_class(cls,
2883
2866
"isinstance() arg 2 must be a class, type,"
2907
2890
if (Py_TYPE(inst) == (PyTypeObject *)cls)
2893
if (PyTuple_Check(cls)) {
2898
if (Py_EnterRecursiveCall(" in __instancecheck__"))
2900
n = PyTuple_GET_SIZE(cls);
2901
for (i = 0; i < n; ++i) {
2902
PyObject *item = PyTuple_GET_ITEM(cls, i);
2903
r = PyObject_IsInstance(inst, item);
2905
/* either found it, or got an error */
2908
Py_LeaveRecursiveCall();
2910
2911
if (name == NULL) {
2911
2912
name = PyString_InternFromString("__instancecheck__");
2912
2913
if (name == NULL)
2934
return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2935
return recursive_isinstance(inst, cls);
2938
recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
2939
recursive_issubclass(PyObject *derived, PyObject *cls)
2943
if (PyType_Check(cls) && PyType_Check(derived)) {
2944
/* Fast path (non-recursive) */
2945
return PyType_IsSubtype(
2946
(PyTypeObject *)derived, (PyTypeObject *)cls);
2942
2948
if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
2943
2949
if (!check_class(derived,
2944
2950
"issubclass() arg 1 must be a class"))
2947
if (PyTuple_Check(cls)) {
2949
Py_ssize_t n = PyTuple_GET_SIZE(cls);
2951
if (!recursion_depth) {
2952
PyErr_SetString(PyExc_RuntimeError,
2953
"nest level of tuple too deep");
2956
for (i = 0; i < n; ++i) {
2957
retval = recursive_issubclass(
2959
PyTuple_GET_ITEM(cls, i),
2962
/* either found it, or got an error */
2969
if (!check_class(cls,
2970
"issubclass() arg 2 must be a class"
2971
" or tuple of classes"))
2953
if (!check_class(cls,
2954
"issubclass() arg 2 must be a class"
2955
" or tuple of classes"))
2975
2957
retval = abstract_issubclass(derived, cls);
2989
2971
static PyObject *name = NULL;
2990
2972
PyObject *t, *v, *tb;
2991
2973
PyObject *checker;
2975
if (PyTuple_Check(cls)) {
2980
if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2982
n = PyTuple_GET_SIZE(cls);
2983
for (i = 0; i < n; ++i) {
2984
PyObject *item = PyTuple_GET_ITEM(cls, i);
2985
r = PyObject_IsSubclass(derived, item);
2987
/* either found it, or got an error */
2990
Py_LeaveRecursiveCall();
2994
name = PyString_InternFromString("__subclasscheck__");
2992
2998
PyErr_Fetch(&t, &v, &tb);
2995
name = PyString_InternFromString("__subclasscheck__");
2999
2999
checker = PyObject_GetAttr(cls, name);
3000
3000
PyErr_Restore(t, v, tb);
3001
3001
if (checker != NULL) {
3004
if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3004
if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3006
3008
res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3007
3009
Py_LeaveRecursiveCall();
3008
3010
Py_DECREF(checker);
3015
return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
3017
return recursive_issubclass(derived, cls);
3021
_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3023
return recursive_isinstance(inst, cls);
3027
_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3029
return recursive_issubclass(derived, cls);