26
26
typedef struct {
27
27
int active ;
28
28
int exit ;
29
+ int warning ;
29
30
char * callback ;
30
31
} php_assert_globals ;
31
32
@@ -39,6 +40,8 @@ int assert_globals_id;
39
40
php_assert_globals assert_globals ;
40
41
#endif
41
42
43
+ #define SAFE_STRING (s ) ((s)?(s):"")
44
+
42
45
PHP_MINIT_FUNCTION (assert );
43
46
PHP_MSHUTDOWN_FUNCTION (assert );
44
47
PHP_RINIT_FUNCTION (assert );
@@ -69,13 +72,15 @@ zend_module_entry assert_module_entry = {
69
72
#define ASSERT_ACTIVE 1
70
73
#define ASSERT_CALLBACK 2
71
74
#define ASSERT_EXIT 3
75
+ #define ASSERT_WARNING 4
72
76
73
77
#ifdef ZTS
74
78
static void php_assert_init_globals (php_assert_globals * assert_globals )
75
79
{
76
80
ASSERT (active ) = 0 ;
77
81
ASSERT (exit ) = 0 ;
78
82
ASSERT (callback ) = 0 ;
83
+ ASSERT (warning ) = 1 ;
79
84
}
80
85
#endif
81
86
@@ -88,17 +93,24 @@ PHP_MINIT_FUNCTION(assert)
88
93
ASSERT (active ) = 0 ;
89
94
ASSERT (exit ) = 0 ;
90
95
ASSERT (callback ) = 0 ;
96
+ ASSERT (warning ) = 1 ;
91
97
#endif
92
98
93
99
REGISTER_LONG_CONSTANT ("ASSERT_ACTIVE" , ASSERT_ACTIVE , CONST_CS |CONST_PERSISTENT );
94
100
REGISTER_LONG_CONSTANT ("ASSERT_CALLBACK" , ASSERT_CALLBACK , CONST_CS |CONST_PERSISTENT );
95
101
REGISTER_LONG_CONSTANT ("ASSERT_EXIT" , ASSERT_EXIT , CONST_CS |CONST_PERSISTENT );
102
+ REGISTER_LONG_CONSTANT ("ASSERT_WARNING" , ASSERT_WARNING , CONST_CS |CONST_PERSISTENT );
96
103
97
104
return SUCCESS ;
98
105
}
99
106
100
107
PHP_MSHUTDOWN_FUNCTION (assert )
101
108
{
109
+ if (ASSERT (callback )) {
110
+ efree (ASSERT (callback ));
111
+ ASSERT (callback ) = NULL ;
112
+ }
113
+
102
114
return SUCCESS ;
103
115
}
104
116
@@ -109,6 +121,13 @@ PHP_RINIT_FUNCTION(assert)
109
121
110
122
PHP_RSHUTDOWN_FUNCTION (assert )
111
123
{
124
+ ASSERTLS_FETCH ();
125
+
126
+ if (ASSERT (callback )) {
127
+ efree (ASSERT (callback ));
128
+ ASSERT (callback ) = NULL ;
129
+ }
130
+
112
131
return SUCCESS ;
113
132
}
114
133
@@ -126,7 +145,9 @@ PHP_FUNCTION(assert)
126
145
{
127
146
pval * * assertion ;
128
147
int val ;
129
- char * myeval = empty_string ;
148
+ char * myeval = NULL ;
149
+ CLS_FETCH ();
150
+ ELS_FETCH ();
130
151
ASSERTLS_FETCH ();
131
152
132
153
if (! ASSERT (active )) {
@@ -139,8 +160,6 @@ PHP_FUNCTION(assert)
139
160
140
161
if ((* assertion )-> type == IS_STRING ) {
141
162
zval retval ;
142
- CLS_FETCH ();
143
- ELS_FETCH ();
144
163
145
164
myeval = (* assertion )-> value .str .val ;
146
165
zend_eval_string (myeval , & retval CLS_CC ELS_CC );
@@ -154,7 +173,53 @@ PHP_FUNCTION(assert)
154
173
if (val ) {
155
174
RETURN_TRUE ;
156
175
}
157
- php_error (E_WARNING ,"Assertion \"%s\" failed" ,myeval );
176
+
177
+ if (ASSERT (callback )) {
178
+ zval * args [5 ];
179
+ zval * retval ;
180
+ int i ;
181
+ uint lineno = zend_get_executed_lineno (ELS_C );
182
+ char * filename = zend_get_executed_filename (ELS_C );
183
+ /*
184
+ char *function = get_active_function_name();
185
+ */
186
+
187
+ MAKE_STD_ZVAL (args [0 ]);
188
+ MAKE_STD_ZVAL (args [1 ]);
189
+ MAKE_STD_ZVAL (args [2 ]);
190
+ MAKE_STD_ZVAL (args [3 ]);
191
+ /*
192
+ MAKE_STD_ZVAL(args[4]);
193
+ */
194
+
195
+ args [0 ]-> type = IS_STRING ; args [0 ]-> value .str .val = estrdup (SAFE_STRING (ASSERT (callback ))); args [0 ]-> value .str .len = strlen (args [0 ]-> value .str .val );
196
+ args [1 ]-> type = IS_STRING ; args [1 ]-> value .str .val = estrdup (SAFE_STRING (filename )); args [1 ]-> value .str .len = strlen (args [1 ]-> value .str .val );
197
+ args [2 ]-> type = IS_LONG ; args [2 ]-> value .lval = lineno ;
198
+ args [3 ]-> type = IS_STRING ; args [3 ]-> value .str .val = estrdup (SAFE_STRING (myeval )); args [3 ]-> value .str .len = strlen (args [3 ]-> value .str .val );
199
+ /*
200
+ this is always "assert" so it's useless
201
+ args[4]->type = IS_STRING; args[4]->value.str.val = estrdup(SAFE_STRING(function)); args[4]->value.str.len = strlen(args[4]->value.str.val);
202
+ */
203
+
204
+ MAKE_STD_ZVAL (retval );
205
+ retval -> type = IS_BOOL ;
206
+ retval -> value .lval = 0 ;
207
+
208
+ call_user_function (CG (function_table ), NULL , args [0 ], retval , 3 , args + 1 );
209
+
210
+ for (i = 0 ; i < 4 ; i ++ ) {
211
+ zval_del_ref (& (args [i ]));
212
+ }
213
+ zval_del_ref (& retval );
214
+ }
215
+
216
+ if (ASSERT (warning )) {
217
+ if (myeval ) {
218
+ php_error (E_WARNING ,"Assertion \"%s\" failed" ,myeval );
219
+ } else {
220
+ php_error (E_WARNING ,"Assertion failed" );
221
+ }
222
+ }
158
223
159
224
if (ASSERT (exit )) {
160
225
zend_bailout ();
@@ -198,9 +263,18 @@ PHP_FUNCTION(assert_options)
198
263
RETURN_LONG (oldint );
199
264
break ;
200
265
266
+ case ASSERT_WARNING :
267
+ oldint = ASSERT (warning );
268
+ if (ac == 2 ) {
269
+ convert_to_long_ex (value );
270
+ ASSERT (warning ) = (* value )-> value .lval ;
271
+ }
272
+ RETURN_LONG (oldint );
273
+ break ;
274
+
201
275
case ASSERT_CALLBACK :
202
276
oldstr = ASSERT (callback );
203
- RETVAL_STRING (oldstr ,1 );
277
+ RETVAL_STRING (SAFE_STRING ( oldstr ) ,1 );
204
278
205
279
if (ac == 2 ) {
206
280
convert_to_string_ex (value );
0 commit comments