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 >= 80000
86 #define DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
87     static const zend_internal_arg_info arginfo_##name[] = { \
88         { (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},
89 #elif PHP_VERSION_ID >= 70200
90 #define DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
91     static const zend_internal_arg_info arginfo_##name[] = { \
92         { (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 },
93 #else
94 #define DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
95     static const zend_internal_arg_info arginfo_##name[] = { \
96         { (const char*)(zend_uintptr_t)(required_num_args), PHP_DS_NS_NAME#class_name, IS_OBJECT, pass_by_ref, allow_null, 0 },
97 #endif
98 
99 #if PHP_VERSION_ID >= 80000
100 #define DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
101     static const zend_internal_arg_info arginfo_##name[] = { \
102         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CLASS_CONST(class_name, allow_null, 0), pass_by_ref},
103 #elif PHP_VERSION_ID >= 70200
104 #define DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
105 	static const zend_internal_arg_info arginfo_##name[] = { \
106 		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_ENCODE_CLASS_CONST(class_name, allow_null), pass_by_ref, 0 },
107 #else
108 #define DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \
109 	static const zend_internal_arg_info arginfo_##name[] = { \
110 		{ (const char*)(zend_uintptr_t)(required_num_args), class_name, IS_OBJECT, pass_by_ref, allow_null, 0 },
111 #endif
112 
113 #if PHP_VERSION_ID >= 80000
114 #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \
115     static const zend_internal_arg_info arginfo_##name[] = { \
116         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CODE(type, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0)) },
117 #elif PHP_VERSION_ID >= 70200
118 #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \
119 	static const zend_internal_arg_info arginfo_##name[] = { \
120 		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_ENCODE(type, allow_null), pass_by_ref, 0 },
121 #else
122 #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \
123 	static const zend_internal_arg_info arginfo_##name[] = { \
124 		{ (const char*)(zend_uintptr_t)(required_num_args), NULL, type, pass_by_ref, allow_null, 0 },
125 #endif
126 
127 #define ARGINFO_ZVAL_RETURN_BOOL(name, z) \
128     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 1, _IS_BOOL, 0) \
129     ZEND_ARG_INFO(0, z) \
130     ZEND_END_ARG_INFO()
131 
132 #define ARGINFO_CALLABLE_RETURN_DS(name, c, col) \
133     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
134     ZEND_ARG_TYPE_INFO(0, c, IS_CALLABLE, 0) \
135     ZEND_END_ARG_INFO()
136 
137 #define ARGINFO_OPTIONAL_ZVAL_RETURN_DS(name, z, col) \
138     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 0, col, 0) \
139     ZEND_ARG_INFO(0, z) \
140     ZEND_END_ARG_INFO()
141 
142 #define ARGINFO_OPTIONAL_STRING_RETURN_STRING(name, s) \
143     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_STRING, 0) \
144     ZEND_ARG_TYPE_INFO(0, s, IS_STRING, 0) \
145     ZEND_END_ARG_INFO()
146 
147 #define ARGINFO_ZVAL_RETURN_DS(name, z, col) \
148     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
149     ZEND_ARG_INFO(0, z) \
150     ZEND_END_ARG_INFO()
151 
152 #define ARGINFO_OPTIONAL_CALLABLE_RETURN_DS(name, c, col) \
153     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 0, col, 0) \
154     ZEND_ARG_TYPE_INFO(0, c, IS_CALLABLE, 1) \
155     ZEND_END_ARG_INFO()
156 
157 #define ARGINFO_LONG_OPTIONAL_LONG_RETURN_DS(name, i1, i2, col) \
158     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
159     ZEND_ARG_TYPE_INFO(0, i1, IS_LONG, 0) \
160     ZEND_ARG_TYPE_INFO(0, i2, IS_LONG, 1) \
161     ZEND_END_ARG_INFO()
162 
163 #define ARGINFO_LONG_RETURN_DS(name, i, col) \
164     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
165     ZEND_ARG_TYPE_INFO(0, i, IS_LONG, 0) \
166     ZEND_END_ARG_INFO()
167 
168 #define ARGINFO_NONE_RETURN_LONG(name) \
169     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_LONG, 0) \
170     ZEND_END_ARG_INFO()
171 
172 #define ARGINFO_NONE_RETURN_STRING(name) \
173     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_STRING, 0) \
174     ZEND_END_ARG_INFO()
175 
176 #define ARGINFO_NONE_RETURN_DS(name, class_name) \
177     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 0, class_name, 0) \
178     ZEND_END_ARG_INFO()
179 
180 #define ARGINFO_NONE_RETURN_OBJ(name, class_name) \
181     DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, 0, 0, #class_name, 1) \
182     ZEND_END_ARG_INFO()
183 
184 #define ARGINFO_NONE_RETURN_BOOL(name) \
185     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, _IS_BOOL, 0) \
186     ZEND_END_ARG_INFO()
187 
188 #define ARGINFO_VARIADIC_ZVAL_RETURN_BOOL(name, v) \
189     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, _IS_BOOL, 0) \
190     ZEND_ARG_VARIADIC_INFO(0, v) \
191     ZEND_END_ARG_INFO()
192 
193 #define ARGINFO_NONE_RETURN_ARRAY(name) \
194     DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, 0, IS_ARRAY, 0) \
195     ZEND_END_ARG_INFO()
196 
197 #define ARGINFO_DS_RETURN_DS(name, obj, cls, col) \
198     DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, 0, 1, col, 0) \
199     ZEND_ARG_OBJ_INFO(0, obj, Ds\\cls, 0) \
200     ZEND_END_ARG_INFO()
201 
202 #endif
203