Skip to content

Commit 61822fc

Browse files
author
Thies C. Arntzen
committed
@ - assert() now accepts the array(&$obj,"methodname") syntax. (Thies)
+ some cleanups
1 parent e7b01fc commit 61822fc

File tree

3 files changed

+68
-75
lines changed

3 files changed

+68
-75
lines changed

ext/standard/assert.c

Lines changed: 43 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ typedef struct {
2929
long bail;
3030
long warning;
3131
long quiet_eval;
32-
char *default_callback;
33-
char *callback;
32+
zval *callback;
3433
} php_assert_globals;
3534

3635
#ifdef ZTS
@@ -53,23 +52,43 @@ php_assert_globals assert_globals;
5352

5453
#define SAFE_STRING(s) ((s)?(s):"")
5554

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+
}
6180

6281
PHP_INI_BEGIN()
6382
STD_PHP_INI_ENTRY("assert.active", "1", PHP_INI_ALL, OnUpdateInt, active, php_assert_globals, assert_globals)
6483
STD_PHP_INI_ENTRY("assert.bail", "0", PHP_INI_ALL, OnUpdateInt, bail, php_assert_globals, assert_globals)
6584
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)
6786
STD_PHP_INI_ENTRY("assert.quiet_eval", "0", PHP_INI_ALL, OnUpdateInt, quiet_eval, php_assert_globals, assert_globals)
6887
PHP_INI_END()
6988

7089
static void php_assert_init_globals(ASSERTLS_D)
7190
{
72-
ASSERT(callback) = 0;
91+
ASSERT(callback) = NULL;
7392
}
7493

7594
PHP_MINIT_FUNCTION(assert)
@@ -92,29 +111,12 @@ PHP_MINIT_FUNCTION(assert)
92111
return SUCCESS;
93112
}
94113

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-
112114
PHP_RSHUTDOWN_FUNCTION(assert)
113115
{
114116
ASSERTLS_FETCH();
115117

116118
if (ASSERT(callback)) {
117-
efree(ASSERT(callback));
119+
zval_ptr_dtor(&ASSERT(callback));
118120
ASSERT(callback) = NULL;
119121
}
120122

@@ -134,10 +136,9 @@ PHP_MINFO_FUNCTION(assert)
134136

135137
PHP_FUNCTION(assert)
136138
{
137-
pval **assertion;
139+
zval **assertion;
138140
int val;
139141
char *myeval = NULL;
140-
char *cbfunc;
141142
char *compiled_string_description;
142143
CLS_FETCH();
143144
ASSERTLS_FETCH();
@@ -185,47 +186,27 @@ PHP_FUNCTION(assert)
185186
}
186187

187188
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];
197190
zval *retval;
198191
int i;
199192
uint lineno = zend_get_executed_lineno(ELS_C);
200193
char *filename = zend_get_executed_filename(ELS_C);
201-
/*
202-
char *function = get_active_function_name();
203-
*/
204194

205195
MAKE_STD_ZVAL(args[0]);
206196
MAKE_STD_ZVAL(args[1]);
207197
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);
221202

222203
MAKE_STD_ZVAL(retval);
223204
ZVAL_BOOL(retval,0);
224205

225206
/* 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);
227208

228-
for (i = 0; i < 4; i++) {
209+
for (i = 0; i <= 2; i++) {
229210
zval_ptr_dtor(&(args[i]));
230211
}
231212
zval_ptr_dtor(&retval);
@@ -252,7 +233,6 @@ PHP_FUNCTION(assert_options)
252233
{
253234
pval **what,**value;
254235
int oldint;
255-
char *oldstr;
256236
int ac = ZEND_NUM_ARGS();
257237
ASSERTLS_FETCH();
258238

@@ -300,17 +280,14 @@ PHP_FUNCTION(assert_options)
300280
break;
301281

302282
case ASSERT_CALLBACK:
303-
oldstr = ASSERT(callback);
304-
RETVAL_STRING(SAFE_STRING(oldstr),1);
305-
306283
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);
312289
}
313-
return;
290+
RETURN_TRUE;
314291
break;
315292

316293
default:

ext/standard/basic_functions.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,6 @@ PHP_MSHUTDOWN_FUNCTION(basic)
821821
PHP_MSHUTDOWN(regex)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
822822
PHP_MSHUTDOWN(browscap)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
823823
PHP_MSHUTDOWN(array)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
824-
PHP_MSHUTDOWN(assert)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
825824
#ifdef TRANS_SID
826825
PHP_MSHUTDOWN(url_scanner_ex)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
827826
#endif
@@ -866,7 +865,6 @@ PHP_RINIT_FUNCTION(basic)
866865

867866
PHP_RINIT(filestat)(INIT_FUNC_ARGS_PASSTHRU);
868867
PHP_RINIT(syslog)(INIT_FUNC_ARGS_PASSTHRU);
869-
PHP_RINIT(assert)(INIT_FUNC_ARGS_PASSTHRU);
870868
PHP_RINIT(dir)(INIT_FUNC_ARGS_PASSTHRU);
871869

872870
#ifdef TRANS_SID

ext/standard/tests/assert/assert.phpt

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,36 @@ assert()
44
--GET--
55
--FILE--
66
<?
7+
function a($file,$line,$myev)
8+
{
9+
echo "assertion failed $line,\"$myev\"\n";
10+
}
11+
12+
class a
13+
{
14+
function assert($file,$line,$myev)
15+
{
16+
echo "class assertion failed $line,\"$myev\"\n";
17+
}
18+
}
19+
720
assert_options(ASSERT_ACTIVE,1);
8-
assert_options(ASSERT_CALLBACK,"a");
921
assert_options(ASSERT_QUIET_EVAL,1);
1022
assert_options(ASSERT_WARNING,0);
11-
assert_options(ASSERT_BAIL,1);
12-
13-
function a($file,$line,$myev)
14-
{ echo "assertion failed $line,\"$myev\"\n";
15-
}
1623

1724
$a = 0;
25+
26+
assert_options(ASSERT_CALLBACK,"a");
27+
assert('$a != 0');
28+
29+
assert_options(ASSERT_CALLBACK,array("a","assert"));
30+
assert('$a != 0');
31+
32+
$obj = new a();
33+
assert_options(ASSERT_CALLBACK,array(&$obj,"assert"));
1834
assert('$a != 0');
1935
?>
2036
--EXPECT--
21-
assertion failed 13,"$a != 0"
37+
assertion failed 22,"$a != 0"
38+
class assertion failed 25,"$a != 0"
39+
class assertion failed 29,"$a != 0"

0 commit comments

Comments
 (0)