@@ -29,8 +29,7 @@ typedef struct {
29
29
long bail ;
30
30
long warning ;
31
31
long quiet_eval ;
32
- char * default_callback ;
33
- char * callback ;
32
+ zval * callback ;
34
33
} php_assert_globals ;
35
34
36
35
#ifdef ZTS
@@ -53,23 +52,43 @@ php_assert_globals assert_globals;
53
52
54
53
#define SAFE_STRING (s ) ((s)?(s):"")
55
54
56
- #define ASSERT_ACTIVE 1
57
- #define ASSERT_CALLBACK 2
58
- #define ASSERT_BAIL 3
59
- #define ASSERT_WARNING 4
60
- #define ASSERT_QUIET_EVAL 5
55
+ enum {
56
+ ASSERT_ACTIVE = 1 ,
57
+ ASSERT_CALLBACK ,
58
+ ASSERT_BAIL ,
59
+ ASSERT_WARNING ,
60
+ ASSERT_QUIET_EVAL
61
+ };
62
+
63
+ static PHP_INI_MH (OnChangeCallback )
64
+ {
65
+ ASSERTLS_FETCH ();
66
+
67
+ if (ASSERT (callback )) {
68
+ zval_dtor (ASSERT (callback ));
69
+ } else {
70
+ MAKE_STD_ZVAL (ASSERT (callback ));
71
+ }
72
+
73
+ if (new_value )
74
+ ZVAL_STRINGL (ASSERT (callback ),new_value ,new_value_length ,1 )
75
+ else
76
+ ZVAL_EMPTY_STRING (ASSERT (callback ))
77
+
78
+ return SUCCESS ;
79
+ }
61
80
62
81
PHP_INI_BEGIN ()
63
82
STD_PHP_INI_ENTRY ("assert.active" , "1" , PHP_INI_ALL , OnUpdateInt , active , php_assert_globals , assert_globals )
64
83
STD_PHP_INI_ENTRY ("assert.bail" , "0" , PHP_INI_ALL , OnUpdateInt , bail , php_assert_globals , assert_globals )
65
84
STD_PHP_INI_ENTRY ("assert.warning" , "1" , PHP_INI_ALL , OnUpdateInt , warning , php_assert_globals , assert_globals )
66
- STD_PHP_INI_ENTRY ("assert.callback" , NULL , PHP_INI_ALL , OnUpdateString , default_callback , php_assert_globals , assert_globals )
85
+ PHP_INI_ENTRY ("assert.callback" , NULL , PHP_INI_ALL , OnChangeCallback )
67
86
STD_PHP_INI_ENTRY ("assert.quiet_eval" , "0" , PHP_INI_ALL , OnUpdateInt , quiet_eval , php_assert_globals , assert_globals )
68
87
PHP_INI_END ()
69
88
70
89
static void php_assert_init_globals (ASSERTLS_D )
71
90
{
72
- ASSERT (callback ) = 0 ;
91
+ ASSERT (callback ) = NULL ;
73
92
}
74
93
75
94
PHP_MINIT_FUNCTION (assert )
@@ -92,29 +111,12 @@ PHP_MINIT_FUNCTION(assert)
92
111
return SUCCESS ;
93
112
}
94
113
95
- PHP_MSHUTDOWN_FUNCTION (assert )
96
- {
97
- return SUCCESS ;
98
- }
99
-
100
- PHP_RINIT_FUNCTION (assert )
101
- {
102
- ASSERTLS_FETCH ();
103
-
104
- if (ASSERT (callback )) {
105
- efree (ASSERT (callback ));
106
- ASSERT (callback ) = NULL ;
107
- }
108
-
109
- return SUCCESS ;
110
- }
111
-
112
114
PHP_RSHUTDOWN_FUNCTION (assert )
113
115
{
114
116
ASSERTLS_FETCH ();
115
117
116
118
if (ASSERT (callback )) {
117
- efree ( ASSERT (callback ));
119
+ zval_ptr_dtor ( & ASSERT (callback ));
118
120
ASSERT (callback ) = NULL ;
119
121
}
120
122
@@ -134,10 +136,9 @@ PHP_MINFO_FUNCTION(assert)
134
136
135
137
PHP_FUNCTION (assert )
136
138
{
137
- pval * * assertion ;
139
+ zval * * assertion ;
138
140
int val ;
139
141
char * myeval = NULL ;
140
- char * cbfunc ;
141
142
char * compiled_string_description ;
142
143
CLS_FETCH ();
143
144
ASSERTLS_FETCH ();
@@ -185,47 +186,27 @@ PHP_FUNCTION(assert)
185
186
}
186
187
187
188
if (ASSERT (callback )) {
188
- cbfunc = ASSERT (callback );
189
- } else if (ASSERT (default_callback )) {
190
- cbfunc = ASSERT (default_callback );
191
- } else {
192
- cbfunc = NULL ;
193
- }
194
-
195
- if (cbfunc ) {
196
- zval * args [5 ];
189
+ zval * args [4 ];
197
190
zval * retval ;
198
191
int i ;
199
192
uint lineno = zend_get_executed_lineno (ELS_C );
200
193
char * filename = zend_get_executed_filename (ELS_C );
201
- /*
202
- char *function = get_active_function_name();
203
- */
204
194
205
195
MAKE_STD_ZVAL (args [0 ]);
206
196
MAKE_STD_ZVAL (args [1 ]);
207
197
MAKE_STD_ZVAL (args [2 ]);
208
- MAKE_STD_ZVAL (args [3 ]);
209
- /*
210
- MAKE_STD_ZVAL(args[4]);
211
- */
212
-
213
- ZVAL_STRING (args [0 ],SAFE_STRING (cbfunc ),1 );
214
- ZVAL_STRING (args [1 ],SAFE_STRING (filename ),1 );
215
- ZVAL_LONG (args [2 ],lineno );
216
- ZVAL_STRING (args [3 ],SAFE_STRING (myeval ),1 );
217
- /*
218
- this is always "assert" so it's useless
219
- 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);
220
- */
198
+
199
+ ZVAL_STRING (args [0 ],SAFE_STRING (filename ),1 );
200
+ ZVAL_LONG (args [1 ],lineno );
201
+ ZVAL_STRING (args [2 ],SAFE_STRING (myeval ),1 );
221
202
222
203
MAKE_STD_ZVAL (retval );
223
204
ZVAL_BOOL (retval ,0 );
224
205
225
206
/* XXX do we want to check for error here? */
226
- call_user_function (CG (function_table ), NULL , args [ 0 ] , retval , 3 , args + 1 );
207
+ call_user_function (CG (function_table ), NULL , ASSERT ( callback ) , retval , 3 , args );
227
208
228
- for (i = 0 ; i < 4 ; i ++ ) {
209
+ for (i = 0 ; i <= 2 ; i ++ ) {
229
210
zval_ptr_dtor (& (args [i ]));
230
211
}
231
212
zval_ptr_dtor (& retval );
@@ -252,7 +233,6 @@ PHP_FUNCTION(assert_options)
252
233
{
253
234
pval * * what ,* * value ;
254
235
int oldint ;
255
- char * oldstr ;
256
236
int ac = ZEND_NUM_ARGS ();
257
237
ASSERTLS_FETCH ();
258
238
@@ -300,17 +280,14 @@ PHP_FUNCTION(assert_options)
300
280
break ;
301
281
302
282
case ASSERT_CALLBACK :
303
- oldstr = ASSERT (callback );
304
- RETVAL_STRING (SAFE_STRING (oldstr ),1 );
305
-
306
283
if (ac == 2 ) {
307
- if (oldstr ) {
308
- efree ( oldstr );
309
- }
310
- convert_to_string_ex ( value ) ;
311
- ASSERT ( callback ) = estrndup ( Z_STRVAL_PP ( value ), Z_STRLEN_PP ( value ) );
284
+ if (ASSERT ( callback ) ) {
285
+ zval_ptr_dtor ( & ASSERT ( callback ) );
286
+ }
287
+ ASSERT ( callback ) = * value ;
288
+ zval_add_ref ( value );
312
289
}
313
- return ;
290
+ RETURN_TRUE ;
314
291
break ;
315
292
316
293
default :
0 commit comments