aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/cython/Cython/Utility/CommonStructures.c
blob: c704a81c2eb2fc1a91c2cba2e5b7717f09a21ea3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/////////////// FetchCommonType.proto /////////////// 
 
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); 
 
/////////////// FetchCommonType /////////////// 
 
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { 
    PyObject* fake_module; 
    PyTypeObject* cached_type = NULL; 
 
    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI); 
    if (!fake_module) return NULL; 
    Py_INCREF(fake_module); 
 
    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name); 
    if (cached_type) { 
        if (!PyType_Check((PyObject*)cached_type)) { 
            PyErr_Format(PyExc_TypeError, 
                "Shared Cython type %.200s is not a type object", 
                type->tp_name); 
            goto bad; 
        } 
        if (cached_type->tp_basicsize != type->tp_basicsize) { 
            PyErr_Format(PyExc_TypeError, 
                "Shared Cython type %.200s has the wrong size, try recompiling", 
                type->tp_name); 
            goto bad; 
        } 
    } else { 
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; 
        PyErr_Clear(); 
        if (PyType_Ready(type) < 0) goto bad; 
        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) 
            goto bad; 
        Py_INCREF(type); 
        cached_type = type; 
    } 
 
done: 
    Py_DECREF(fake_module); 
    // NOTE: always returns owned reference, or NULL on error 
    return cached_type; 
 
bad: 
    Py_XDECREF(cached_type); 
    cached_type = NULL; 
    goto done; 
} 
 
 
/////////////// FetchCommonPointer.proto /////////////// 
 
static void* __Pyx_FetchCommonPointer(void* pointer, const char* name); 
 
/////////////// FetchCommonPointer /////////////// 
 
 
static void* __Pyx_FetchCommonPointer(void* pointer, const char* name) { 
#if PY_VERSION_HEX >= 0x02070000 
    PyObject* fake_module = NULL; 
    PyObject* capsule = NULL; 
    void* value = NULL; 
 
    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI); 
    if (!fake_module) return NULL; 
    Py_INCREF(fake_module); 
 
    capsule = PyObject_GetAttrString(fake_module, name); 
    if (!capsule) { 
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; 
        PyErr_Clear(); 
        capsule = PyCapsule_New(pointer, name, NULL); 
        if (!capsule) goto bad; 
        if (PyObject_SetAttrString(fake_module, name, capsule) < 0) 
            goto bad; 
    } 
    value = PyCapsule_GetPointer(capsule, name); 
 
bad: 
    Py_XDECREF(capsule); 
    Py_DECREF(fake_module); 
    return value; 
#else 
    return pointer; 
#endif 
}