xref: /ext-ds/src/php/arginfo.h (revision 07801172)
1 #ifndef DS_ARGINFO_H
2 #define DS_ARGINFO_H
3 
4 #define ARGINFO_NONE(name) \
5 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \
6 ZEND_END_ARG_INFO()
7 
8 #define ARGINFO_OPTIONAL_ZVAL(name, z) \
9 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \
10 ZEND_ARG_INFO(0, z) \
11 ZEND_END_ARG_INFO()
12 
13 #define ARGINFO_OPTIONAL_ZVAL_OPTIONAL_ZVAL(name, z1, z2) \
14 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \
15 ZEND_ARG_INFO(0, z1) \
16 ZEND_ARG_INFO(0, z2) \
17 ZEND_END_ARG_INFO()
18 
19 #define ARGINFO_CALLABLE_OPTIONAL_ZVAL(name, c, z) \
20 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
21 ZEND_ARG_TYPE_INFO(0, c, IS_CALLABLE, 0) \
22 ZEND_ARG_INFO(0, z) \
23 ZEND_END_ARG_INFO()
24 
25 #define ARGINFO_OPTIONAL_STRING(name, s) \
26 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \
27 ZEND_ARG_TYPE_INFO(0, s, IS_STRING, 0) \
28 ZEND_END_ARG_INFO()
29 
30 #define ARGINFO_OPTIONAL_CALLABLE(name, c) \
31 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \
32 ZEND_ARG_TYPE_INFO(0, c, IS_CALLABLE, 1) \
33 ZEND_END_ARG_INFO()
34 
35 #define ARGINFO_CALLABLE(name, c) \
36 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
37 ZEND_ARG_TYPE_INFO(0, c, IS_CALLABLE, 0) \
38 ZEND_END_ARG_INFO()
39 
40 #define ARGINFO_VARIADIC_ZVAL(name, v) \
41 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \
42 ZEND_ARG_VARIADIC_INFO(0, v) \
43 ZEND_END_ARG_INFO()
44 
45 #define ARGINFO_LONG(name, i) \
46 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
47 ZEND_ARG_TYPE_INFO(0, i, IS_LONG, 0) \
48 ZEND_END_ARG_INFO()
49 
50 #define ARGINFO_LONG_ZVAL(name, i, z) \
51 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 2) \
52 ZEND_ARG_TYPE_INFO(0, i, IS_LONG, 0) \
53 ZEND_ARG_INFO(0, z) \
54 ZEND_END_ARG_INFO()
55 
56 #define ARGINFO_ZVAL_LONG(name, z, i) \
57 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 2) \
58 ZEND_ARG_INFO(0, z) \
59 ZEND_ARG_TYPE_INFO(0, i, IS_LONG, 0) \
60 ZEND_END_ARG_INFO()
61 
62 #define ARGINFO_ZVAL(name, z) \
63 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
64 ZEND_ARG_INFO(0, z) \
65 ZEND_END_ARG_INFO()
66 
67 #define ARGINFO_ZVAL_ZVAL(name, z1, z2) \
68 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 2) \
69 ZEND_ARG_INFO(0, z1) \
70 ZEND_ARG_INFO(0, z2) \
71 ZEND_END_ARG_INFO()
72 
73 #define ARGINFO_ZVAL_OPTIONAL_ZVAL(name, z1, z2) \
74 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
75 ZEND_ARG_INFO(0, z1) \
76 ZEND_ARG_INFO(0, z2) \
77 ZEND_END_ARG_INFO()
78 
79 #define ARGINFO_LONG_VARIADIC_ZVAL(name, i, v) \
80 ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
81 ZEND_ARG_TYPE_INFO(0, i, IS_LONG, 0) \
82 ZEND_ARG_VARIADIC_INFO(0, v) \
83 ZEND_END_ARG_INFO()
84 
85 #if PHP_VERSION_ID >= 80100
86 
87 #define ARGINFO_OFFSET_GET(name) \
88     ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 1, IS_MIXED, 0) \
89 	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \
90     ZEND_END_ARG_INFO()
91 
92 #define ARGINFO_OFFSET_SET(name) \
93     ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 2, IS_VOID, 0) \
94 	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \
95 	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) \
96     ZEND_END_ARG_INFO()
97 
98 #define ARGINFO_OFFSET_UNSET(name) \
99     ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 1, IS_VOID, 0) \
100 	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \
101     ZEND_END_ARG_INFO()
102 
103 #elif PHP_VERSION_ID >= 80000
104 
105 #define ARGINFO_OFFSET_GET(name) \
106     ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
107 	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \
108     ZEND_END_ARG_INFO()
109 
110 #define ARGINFO_OFFSET_SET(name) \
111     ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 2) \
112 	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \
113 	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) \
114     ZEND_END_ARG_INFO()
115 
116 #define ARGINFO_OFFSET_UNSET(name) \
117     ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
118 	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \
119     ZEND_END_ARG_INFO()
120 
121 #else
122 
123 #define ARGINFO_OFFSET_GET(name) \
124     ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
125     ZEND_ARG_INFO(0, offset) \
126     ZEND_END_ARG_INFO()
127 
128 #define ARGINFO_OFFSET_SET(name) \
129     ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 2) \
130     ZEND_ARG_INFO(0, offset) \
131     ZEND_ARG_INFO(0, value) \
132     ZEND_END_ARG_INFO()
133 
134 #define ARGINFO_OFFSET_UNSET(name) \
135     ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \
136     ZEND_ARG_INFO(0, offset) \
137     ZEND_END_ARG_INFO()
138 
139 #endif
140 
141 #if PHP_VERSION_ID >= 80100
142 
143 #define ARGINFO_NONE_RETURN_TYPE(name, type) \
144     ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 0, type, 0) \
145     ZEND_END_ARG_INFO()
146 #else
147 
148 #define ARGINFO_NONE_RETURN_TYPE(name, type) \
149     ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \
150     ZEND_END_ARG_INFO()
151 
152 #endif
153 
154 #if PHP_VERSION_ID >= 80000
155 #define DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
156     static const zend_internal_arg_info arginfo_##name[] = { \
157         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CLASS_CONST(PHP_DS_NS_NAME#class_name, allow_null, 0), pass_by_ref},
158 #elif PHP_VERSION_ID >= 70200
159 #define DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
160     static const zend_internal_arg_info arginfo_##name[] = { \
161         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_ENCODE_CLASS_CONST(PHP_DS_NS_NAME#class_name, allow_null), pass_by_ref, 0 },
162 #else
163 #define DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
164     static const zend_internal_arg_info arginfo_##name[] = { \
165         { (const char*)(zend_uintptr_t)(required_num_args), PHP_DS_NS_NAME#class_name, IS_OBJECT, pass_by_ref, allow_null, 0 },
166 #endif
167 
168 #if PHP_VERSION_ID >= 80000
169 #define DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
170     static const zend_internal_arg_info arginfo_##name[] = { \
171         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CLASS_CONST(class_name, allow_null, 0), pass_by_ref},
172 #elif PHP_VERSION_ID >= 70200
173 #define DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
174 	static const zend_internal_arg_info arginfo_##name[] = { \
175 		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_ENCODE_CLASS_CONST(class_name, allow_null), pass_by_ref, 0 },
176 #else
177 #define DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
178 	static const zend_internal_arg_info arginfo_##name[] = { \
179 		{ (const char*)(zend_uintptr_t)(required_num_args), class_name, IS_OBJECT, pass_by_ref, allow_null, 0 },
180 #endif
181 
182 #if PHP_VERSION_ID >= 80100
183 #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \
184     static const zend_internal_arg_info arginfo_##name[] = { \
185         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CODE(type, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)) },
186 #elif PHP_VERSION_ID >= 80000
187 #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \
188     static const zend_internal_arg_info arginfo_##name[] = { \
189         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CODE(type, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0)) },
190 #elif PHP_VERSION_ID >= 70200
191 #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \
192 	static const zend_internal_arg_info arginfo_##name[] = { \
193 		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_ENCODE(type, allow_null), pass_by_ref, 0 },
194 #else
195 #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \
196 	static const zend_internal_arg_info arginfo_##name[] = { \
197 		{ (const char*)(zend_uintptr_t)(required_num_args), NULL, type, pass_by_ref, allow_null, 0 },
198 #endif
199 
200 #define ARGINFO_ZVAL_RETURN_BOOL(name, z) \
201     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 1, _IS_BOOL, 0) \
202     ZEND_ARG_INFO(0, z) \
203     ZEND_END_ARG_INFO()
204 
205 #define ARGINFO_CALLABLE_RETURN_DS(name, c, col) \
206     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
207     ZEND_ARG_TYPE_INFO(0, c, IS_CALLABLE, 0) \
208     ZEND_END_ARG_INFO()
209 
210 #define ARGINFO_OPTIONAL_ZVAL_RETURN_DS(name, z, col) \
211     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 0, col, 0) \
212     ZEND_ARG_INFO(0, z) \
213     ZEND_END_ARG_INFO()
214 
215 #define ARGINFO_OPTIONAL_STRING_RETURN_STRING(name, s) \
216     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_STRING, 0) \
217     ZEND_ARG_TYPE_INFO(0, s, IS_STRING, 0) \
218     ZEND_END_ARG_INFO()
219 
220 #define ARGINFO_ZVAL_RETURN_DS(name, z, col) \
221     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
222     ZEND_ARG_INFO(0, z) \
223     ZEND_END_ARG_INFO()
224 
225 #define ARGINFO_OPTIONAL_CALLABLE_RETURN_DS(name, c, col) \
226     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 0, col, 0) \
227     ZEND_ARG_TYPE_INFO(0, c, IS_CALLABLE, 1) \
228     ZEND_END_ARG_INFO()
229 
230 #define ARGINFO_LONG_OPTIONAL_LONG_RETURN_DS(name, i1, i2, col) \
231     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
232     ZEND_ARG_TYPE_INFO(0, i1, IS_LONG, 0) \
233     ZEND_ARG_TYPE_INFO(0, i2, IS_LONG, 1) \
234     ZEND_END_ARG_INFO()
235 
236 #define ARGINFO_LONG_RETURN_DS(name, i, col) \
237     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
238     ZEND_ARG_TYPE_INFO(0, i, IS_LONG, 0) \
239     ZEND_END_ARG_INFO()
240 
241 #define ARGINFO_NONE_RETURN_LONG(name) \
242     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_LONG, 0) \
243     ZEND_END_ARG_INFO()
244 
245 #define ARGINFO_NONE_RETURN_STRING(name) \
246     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_STRING, 0) \
247     ZEND_END_ARG_INFO()
248 
249 #define ARGINFO_NONE_RETURN_DS(name, class_name) \
250     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 0, class_name, 0) \
251     ZEND_END_ARG_INFO()
252 
253 #define ARGINFO_NONE_RETURN_OBJ(name, class_name) \
254     DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, 0, 0, #class_name, 0) \
255     ZEND_END_ARG_INFO()
256 
257 #define ARGINFO_NONE_RETURN_BOOL(name) \
258     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, _IS_BOOL, 0) \
259     ZEND_END_ARG_INFO()
260 
261 #define ARGINFO_VARIADIC_ZVAL_RETURN_BOOL(name, v) \
262     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, _IS_BOOL, 0) \
263     ZEND_ARG_VARIADIC_INFO(0, v) \
264     ZEND_END_ARG_INFO()
265 
266 #define ARGINFO_NONE_RETURN_ARRAY(name) \
267     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_ARRAY, 0) \
268     ZEND_END_ARG_INFO()
269 
270 #define ARGINFO_DS_RETURN_DS(name, obj, cls, col) \
271     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
272     ZEND_ARG_OBJ_INFO(0, obj, Ds\\cls, 0) \
273     ZEND_END_ARG_INFO()
274 
275 #endif
276