1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Function object interface */
3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_FUNCOBJECT_H
5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_FUNCOBJECT_H
6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus
7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern "C" {
8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Function objects and code objects should not be confused with each other:
11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel *
12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Function objects are created by the execution of the 'def' statement.
13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * They reference a code object in their func_code attribute, which is a
14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * purely syntactic object, i.e. nothing more than a compiled version of some
15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * source code lines.  There is one code object per source code "fragment",
16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * but each code object can be referenced by zero or many function objects
17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * depending only on how many times the 'def' statement in the source was
18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * executed so far.
19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct {
22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject_HEAD
23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_code;	/* A code object */
24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_globals;	/* A dictionary (other mappings won't do) */
25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_defaults;	/* NULL or a tuple */
26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_closure;	/* NULL or a tuple of cell objects */
27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_doc;		/* The __doc__ attribute, can be anything */
28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_name;	/* The __name__ attribute, a string object */
29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_dict;	/* The __dict__ attribute, a dict or NULL */
30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_weakreflist;	/* List of weak references */
31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func_module;	/* The __module__ attribute, can be anything */
32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Invariant:
34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     *     func_closure contains the bindings for func_code->co_freevars, so
35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     *     PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code)
36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     *     (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0).
37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} PyFunctionObject;
39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyFunction_Type;
41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type)
43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *);
45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *);
46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *);
47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *);
48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *);
49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *);
50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *);
51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *);
52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Macros for direct access to these values. Type checks are *not*
54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   done, so use with care. */
55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyFunction_GET_CODE(func) \
56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        (((PyFunctionObject *)func) -> func_code)
57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyFunction_GET_GLOBALS(func) \
58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel	(((PyFunctionObject *)func) -> func_globals)
59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyFunction_GET_MODULE(func) \
60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel	(((PyFunctionObject *)func) -> func_module)
61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyFunction_GET_DEFAULTS(func) \
62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel	(((PyFunctionObject *)func) -> func_defaults)
63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyFunction_GET_CLOSURE(func) \
64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel	(((PyFunctionObject *)func) -> func_closure)
65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The classmethod and staticmethod types lives here, too */
67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyClassMethod_Type;
68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyStaticMethod_Type;
69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *);
71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *);
72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus
74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* !Py_FUNCOBJECT_H */
77