1#ifndef PyObjC_SELECTOR_H
2#define PyObjC_SELECTOR_H
3
4/* We have a small class-tree for selector/objective-C methods: A base type
5 * and two subtypes (one for methods implemented in python and one for methods
6 * implemented in Objective-C)
7 */
8
9#define PyObjCSelector_kCLASS_METHOD          0x000001
10#define PyObjCSelector_kHIDDEN                0x000002
11#define PyObjCSelector_kREQUIRED              0x000004
12#define PyObjCSelector_kRETURNS_UNINITIALIZED 0x000010
13
14#define PyObjCSelector_HEAD \
15	PyObject_HEAD 			\
16	const char*	sel_python_signature;  \
17	const char* 	sel_native_signature; \
18	SEL		sel_selector;	\
19	PyObject*	sel_self;	\
20	Class		sel_class;	\
21	int		sel_flags;	\
22	PyObjCMethodSignature* sel_methinfo;
23
24
25/*!
26 * @typedef PyObjC_CallFunc
27 * @param meth A selector object
28 * @param self The self argument
29 * @param args The other arguments
30 * @result Returns the return value, or NULL if an exception occurred
31 */
32typedef PyObject* (*PyObjC_CallFunc)(
33	PyObject* meth, PyObject* self, PyObject* args);
34
35typedef struct {
36	PyObjCSelector_HEAD
37} PyObjCSelector;
38
39typedef struct {
40	PyObjCSelector_HEAD
41	PyObjC_CallFunc sel_call_func;
42} PyObjCNativeSelector;
43
44typedef struct {
45	PyObjCSelector_HEAD
46	PyObject*	callable;
47	Py_ssize_t	argcount;
48	Py_ssize_t	numoutput;
49} PyObjCPythonSelector;
50
51extern PyTypeObject PyObjCSelector_Type;
52extern PyTypeObject PyObjCNativeSelector_Type;
53extern PyTypeObject PyObjCPythonSelector_Type;
54#define PyObjCSelector_Check(obj) PyObject_TypeCheck(obj, &PyObjCSelector_Type)
55#define PyObjCNativeSelector_Check(obj) PyObject_TypeCheck(obj, &PyObjCNativeSelector_Type)
56#define PyObjCPythonSelector_Check(obj) PyObject_TypeCheck(obj, &PyObjCPythonSelector_Type)
57
58PyObject* PyObjCSelector_Copy(PyObject* obj);
59const char* PyObjCSelector_Signature(PyObject* obj);
60#define PyObjCSelector_GetNativeSignature(obj) (((PyObjCSelector*)obj)->sel_native_signature)
61SEL   PyObjCSelector_GetSelector(PyObject* obj);
62int   PyObjCSelector_GetFlags(PyObject* obj);
63Class PyObjCSelector_GetClass(PyObject* obj);
64int   PyObjCSelector_Required(PyObject* obj);
65int   PyObjCSelector_IsClassMethod(PyObject* obj);
66int   PyObjCSelector_IsHidden(PyObject* obj);
67int ObjC_SignatureForSelector(char* class_name, SEL selector, char* signature);
68PyObjCMethodSignature* PyObjCSelector_GetMetadata(PyObject* _self);
69
70
71
72PyObject* PyObjCSelector_NewNative(Class class, SEL selector, const char* signature, int class_method) ;
73PyObject* PyObjCSelector_FindNative(PyObject* self, const char* name);
74
75#define PyObjCSelector_GET_CLASS(obj) (((PyObjCSelector*)(obj))->sel_class)
76#define PyObjCSelector_GET_SELECTOR(obj) (((PyObjCSelector*)(obj))->sel_selector)
77
78PyObject* PyObjCSelector_New(PyObject* callable, SEL selector, const char* signature, int class_method, Class class) ;
79SEL PyObjCSelector_DefaultSelector(const char* methname);
80
81
82PyObject*
83PyObjCSelector_FromFunction(
84	PyObject* pyname,
85	PyObject* callable,
86	PyObject* template_class,
87	PyObject* protocols);
88
89
90#endif /* PyObjC_SELECTOR_H */
91