1 /**
2   Mirror _methodobject.h
3 
4 Method object interface
5   */
6 module deimos.python.methodobject;
7 
8 import core.stdc.stdio;
9 import deimos.python.pyport;
10 import deimos.python.object;
11 
12 extern(C):
13 // Python-header-file: Include/methodobject.h:
14 
15 /** This is about the type 'builtin_function_or_method',
16    not Python methods in user-defined classes.  See classobject.h
17    for the latter. */
18 mixin(PyAPI_DATA!"PyTypeObject PyCFunction_Type");
19 
20 // D translation of C macro:
21 /// _
22 int PyCFunction_Check()(PyObject *op) {
23     return Py_TYPE(op) == &PyCFunction_Type;
24 }
25 
26 /// _
27 alias PyObject* function(PyObject*, PyObject*) PyCFunction;
28 /// _
29 alias PyObject* function(PyObject*, PyObject*,PyObject*) PyCFunctionWithKeywords;
30 /// _
31 alias PyObject* function(PyObject*) PyNoArgsFunction;
32 
33 /// _
34 PyCFunction PyCFunction_GetFunction(PyObject*);
35 // TODO: returns borrowed ref?
36 /// _
37 PyObject* PyCFunction_GetSelf(PyObject*);
38 /// _
39 int PyCFunction_GetFlags(PyObject*);
40 /** Macros for direct access to these values. Type checks are *not*
41    done, so use with care. */
42 auto PyCFunction_GET_FUNCTION()(PyObject* func) {
43     return (cast(PyCFunctionObject*)func).m_ml.ml_meth;
44 }
45 /// ditto
46 auto PyCFunction_GET_SELF()(PyObject* func) {
47     return (cast(PyCFunctionObject*)func).m_self;
48 }
49 /// ditto
50 auto PyCFunction_GET_FLAGS(PyObject* func) {
51     return (cast(PyCFunctionObject*)func).m_ml.ml_flags;
52 }
53 
54 /// _
55 PyObject* PyCFunction_Call(PyObject*, PyObject*, PyObject*);
56 
57 /// _
58 struct PyMethodDef {
59     /** The name of the built-in function/method */
60     const(char)*	ml_name;
61     /** The C function that implements it */
62     PyCFunction  ml_meth;
63     /** Combination of METH_xxx flags, which mostly
64       describe the args expected by the C func */
65     int		 ml_flags;
66     /** The __doc__ attribute, or NULL */
67     const(char)*	ml_doc;
68 }
69 
70 version(Python_3_0_Or_Later) {
71 }else{
72     // TODO: returns borrowed ref?
73     /// Availability: 2.*
74     PyObject* Py_FindMethod(PyMethodDef*, PyObject*, const(char)*);
75 }
76 /// _
77 PyObject* PyCFunction_NewEx(PyMethodDef*, PyObject*,PyObject*);
78 /// _
79 PyObject* PyCFunction_New()(PyMethodDef* ml, PyObject* self) {
80     return PyCFunction_NewEx(ml, self, null);
81 }
82 
83 /** Flag passed to newmethodobject */
84 enum int METH_OLDARGS = 0x0000;
85 /// ditto
86 enum int METH_VARARGS = 0x0001;
87 /// ditto
88 enum int METH_KEYWORDS= 0x0002;
89 /** METH_NOARGS and METH_O must not be combined with the flags above. */
90 enum int METH_NOARGS  = 0x0004;
91 /// ditto
92 enum int METH_O       = 0x0008;
93 
94 /** METH_CLASS and METH_STATIC are a little different; these control
95    the construction of methods for a class.  These cannot be used for
96    functions in modules. */
97 enum int METH_CLASS   = 0x0010;
98 /// ditto
99 enum int METH_STATIC  = 0x0020;
100 /** METH_COEXIST allows a method to be entered eventhough a slot has
101    already filled the entry.  When defined, the flag allows a separate
102    method, "__contains__" for example, to coexist with a defined
103    slot like sq_contains. */
104 enum int METH_COEXIST = 0x0040;
105 
106 enum int METH_FASTCALL = 0x0080;
107 
108 version(Python_3_0_Or_Later) {
109 }else{
110     /// Availability: 2.*
111     struct PyMethodChain {
112         /** Methods of this type */
113         PyMethodDef *methods;
114         /** NULL or base type */
115         PyMethodChain *link;
116     }
117 
118     /// Availability: 2.*
119     PyObject* Py_FindMethodInChain(PyMethodChain*, PyObject*, const(char)*);
120 }
121 
122 /// subclass of PyObject
123 struct PyCFunctionObject {
124     mixin PyObject_HEAD;
125 
126     /** Description of the C function to call */
127     PyMethodDef* m_ml;
128     /** Passed as 'self' arg to the C func, can be NULL */
129     PyObject*    m_self;
130     /** The __module__ attribute, can be anything */
131     PyObject*    m_module;
132     version(Python_3_5_Or_Later) {
133         PyObject* m_weakreflist;
134     }
135 }
136 
137 version(Python_2_6_Or_Later) {
138     /// Availability: >= 2.6
139     int PyCFunction_ClearFreeList();
140 }
141 
142 version(Python_2_7_Or_Later) {
143     /// Availability: >= 2.7
144     void _PyCFunction_DebugMallocStats(FILE* out_);
145     /// Availability: >= 2.7
146     void _PyMethod_DebugMallocStats(FILE* out_);
147 }
148 
149