aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Include/funcobject.h
blob: 591ace4d425e844c3fca85e05738e1a7be87ada2 (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
87
88
89
90
91
92
93
94
95
96
97
98
 
/* Function object interface */ 
#ifndef Py_LIMITED_API 
#ifndef Py_FUNCOBJECT_H 
#define Py_FUNCOBJECT_H 
#ifdef __cplusplus 
extern "C" { 
#endif 
 
/* Function objects and code objects should not be confused with each other: 
 * 
 * Function objects are created by the execution of the 'def' statement. 
 * They reference a code object in their __code__ attribute, which is a 
 * purely syntactic object, i.e. nothing more than a compiled version of some 
 * source code lines.  There is one code object per source code "fragment", 
 * but each code object can be referenced by zero or many function objects 
 * depending only on how many times the 'def' statement in the source was 
 * executed so far. 
 */ 
 
typedef struct { 
    PyObject_HEAD 
    PyObject *func_code;        /* A code object, the __code__ attribute */ 
    PyObject *func_globals;     /* A dictionary (other mappings won't do) */ 
    PyObject *func_defaults;    /* NULL or a tuple */ 
    PyObject *func_kwdefaults;  /* NULL or a dict */ 
    PyObject *func_closure;     /* NULL or a tuple of cell objects */ 
    PyObject *func_doc;         /* The __doc__ attribute, can be anything */ 
    PyObject *func_name;        /* The __name__ attribute, a string object */ 
    PyObject *func_dict;        /* The __dict__ attribute, a dict or NULL */ 
    PyObject *func_weakreflist; /* List of weak references */ 
    PyObject *func_module;      /* The __module__ attribute, can be anything */ 
    PyObject *func_annotations; /* Annotations, a dict or NULL */ 
    PyObject *func_qualname;    /* The qualified name */ 
    vectorcallfunc vectorcall;
 
    /* Invariant: 
     *     func_closure contains the bindings for func_code->co_freevars, so 
     *     PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) 
     *     (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). 
     */ 
} PyFunctionObject; 
 
PyAPI_DATA(PyTypeObject) PyFunction_Type; 
 
#define PyFunction_Check(op) Py_IS_TYPE(op, &PyFunction_Type)
 
PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); 
PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_GetKwDefaults(PyObject *); 
PyAPI_FUNC(int) PyFunction_SetKwDefaults(PyObject *, PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); 
PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); 
PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); 
PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); 
 
#ifndef Py_LIMITED_API 
PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall(
    PyObject *func, 
    PyObject *const *stack, 
    size_t nargsf,
    PyObject *kwnames); 
#endif 
 
/* Macros for direct access to these values. Type checks are *not* 
   done, so use with care. */ 
#define PyFunction_GET_CODE(func) \ 
        (((PyFunctionObject *)func) -> func_code) 
#define PyFunction_GET_GLOBALS(func) \ 
        (((PyFunctionObject *)func) -> func_globals) 
#define PyFunction_GET_MODULE(func) \ 
        (((PyFunctionObject *)func) -> func_module) 
#define PyFunction_GET_DEFAULTS(func) \ 
        (((PyFunctionObject *)func) -> func_defaults) 
#define PyFunction_GET_KW_DEFAULTS(func) \ 
        (((PyFunctionObject *)func) -> func_kwdefaults) 
#define PyFunction_GET_CLOSURE(func) \ 
        (((PyFunctionObject *)func) -> func_closure) 
#define PyFunction_GET_ANNOTATIONS(func) \ 
        (((PyFunctionObject *)func) -> func_annotations) 
 
/* The classmethod and staticmethod types lives here, too */ 
PyAPI_DATA(PyTypeObject) PyClassMethod_Type; 
PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; 
 
PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); 
PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); 
 
#ifdef __cplusplus 
} 
#endif 
#endif /* !Py_FUNCOBJECT_H */ 
#endif /* Py_LIMITED_API */