1 #ifndef EO_PTR_INDIRECTION_H
2 #define EO_PTR_INDIRECTION_H
3 
4 #include "Eo.h"
5 #include "eo_private.h"
6 
7 /* Macro used to obtain the object pointer and return if fails. */
8 
9 void _eo_pointer_error(const Eo *obj_id, const char *func_name, const char *file, int line, const char *fmt, ...);
10 
11 #define _EO_POINTER_ERR(obj_id, fmt, ...) \
12   _eo_pointer_error(obj_id, __func__, __FILE__, __LINE__, fmt, __VA_ARGS__)
13 
14 #define EO_OBJ_POINTER(obj_id, obj) \
15    _Eo_Object *obj; \
16    do { \
17       obj = _eo_obj_pointer_get((Eo_Id)obj_id, __func__, __FILE__, __LINE__); \
18    } while (0)
19 
20 #define EO_OBJ_POINTER_PROXY(obj_id, obj) \
21    _Eo_Object *obj; \
22    do { \
23       obj = _eo_obj_pointer_get((Eo_Id)obj_id, func_name, file, line); \
24    } while (0)
25 
26 #define EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, ret)  \
27    _Eo_Object *obj; \
28    do { \
29       obj = _eo_obj_pointer_get((Eo_Id)obj_id, __func__, __FILE__, __LINE__); \
30       if (!obj) return (ret); \
31    } while (0)
32 
33 /* reports as another function using func_name, file and line variables */
34 #define EO_OBJ_POINTER_RETURN_VAL_PROXY(obj_id, obj, ret) \
35    _Eo_Object *obj; \
36    do { \
37       obj = _eo_obj_pointer_get((Eo_Id)obj_id, func_name, file, line); \
38       if (!obj) return (ret); \
39    } while (0)
40 
41 #define EO_OBJ_POINTER_RETURN(obj_id, obj) \
42    _Eo_Object *obj; \
43    do { \
44       obj = _eo_obj_pointer_get((Eo_Id)obj_id, __func__, __FILE__, __LINE__); \
45       if (!obj) return; \
46    } while (0)
47 
48 #define EO_OBJ_POINTER_RETURN_PROXY(obj_id, obj) \
49    _Eo_Object *obj; \
50    do { \
51       obj = _eo_obj_pointer_get((Eo_Id)obj_id, func_name, file, line); \
52       if (!obj) return; \
53    } while (0)
54 
55 #define EO_OBJ_POINTER_GOTO(obj_id, obj, label) \
56    _Eo_Object *obj; \
57    do { \
58       obj = _eo_obj_pointer_get((Eo_Id)obj_id, __func__, __FILE__, __LINE__); \
59       if (!obj) goto label; \
60    } while (0)
61 
62 #define EO_OBJ_POINTER_GOTO_PROXY(obj_id, obj, label) \
63    _Eo_Object *obj; \
64    do { \
65       obj = _eo_obj_pointer_get((Eo_Id)obj_id, func_name, file, line); \
66       if (!obj) goto label; \
67    } while (0)
68 
69 #define EO_CLASS_POINTER(klass_id, klass)   \
70    _Efl_Class *klass; \
71    do { \
72       klass = _eo_class_pointer_get(klass_id); \
73    } while (0)
74 
75 #define EO_CLASS_POINTER_PROXY(klass_id, klass)   \
76    _Efl_Class *klass; \
77    do { \
78       klass = _eo_class_pointer_get(klass_id); \
79    } while (0)
80 
81 #define EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, ret) \
82    _Efl_Class *klass; \
83    do { \
84       klass = _eo_class_pointer_get(klass_id); \
85       if (!klass) { \
86          _EO_POINTER_ERR(klass_id, "Class (%p) is an invalid ref.", klass_id); \
87          return ret; \
88       } \
89    } while (0)
90 
91 #define EO_CLASS_POINTER_RETURN_VAL_PROXY(klass_id, klass, ret) \
92    _Efl_Class *klass; \
93    do { \
94       klass = _eo_class_pointer_get(klass_id); \
95       if (!klass) { \
96          _EO_POINTER_ERR(klass_id, "Class (%p) is an invalid ref.", klass_id); \
97          return ret; \
98       } \
99    } while (0)
100 
101 #define EO_CLASS_POINTER_RETURN(klass_id, klass)   \
102    _Efl_Class *klass; \
103    do { \
104       klass = _eo_class_pointer_get(klass_id); \
105       if (!klass) { \
106          _EO_POINTER_ERR(klass_id, "Class (%p) is an invalid ref.", klass_id); \
107          return; \
108       } \
109    } while (0)
110 
111 #define EO_CLASS_POINTER_RETURN_PROXY(klass_id, klass) \
112    _Efl_Class *klass; \
113    do { \
114       klass = _eo_class_pointer_get(klass_id); \
115       if (!klass) { \
116          _EO_POINTER_ERR(klass_id, "Class (%p) is an invalid ref.", klass_id); \
117          return; \
118       } \
119    } while (0)
120 
121 #define EO_CLASS_POINTER_GOTO(klass_id, klass, label) \
122    _Efl_Class *klass; \
123    do { \
124       klass = _eo_class_pointer_get(klass_id); \
125       if (!klass) goto label; \
126    } while (0)
127 
128 #define EO_CLASS_POINTER_GOTO_PROXY(klass_id, klass, label) \
129    _Efl_Class *klass; \
130    do { \
131       klass = _eo_class_pointer_get(klass_id); \
132       if (!klass) goto label; \
133    } while (0)
134 
135 #define EO_OBJ_DONE(obj_id) \
136    _eo_obj_pointer_done((Eo_Id)obj_id)
137 
138 #ifdef EFL_DEBUG
139 static inline void _eo_print(Eo_Id_Table_Data *tdata);
140 #endif
141 
142 extern Eina_TLS _eo_table_data;
143 
144 #include "eo_ptr_indirection.x"
145 
146 extern Eo_Id_Data *_eo_table_data_shared;
147 extern Eo_Id_Table_Data *_eo_table_data_shared_data;
148 
149 #endif
150 
151