com php-src: assert() user message: NEWS ext/standard/assert.c ext/standard/tests/assert/assert04.phpt ext/standard/tests/asse rt/assert_basic6.phpt
ext/standard/tests/assert/assert _error1.phpt ext/standard/tests/assert/assert_error 2.phpt ext/standard/tests/assert/assert_error3.phpt
ext/standard/tests/assert/assert_error4.phpt
| From: | Lars Strojny | Date: | Fri, 31 Aug 2012 17:04:53 +0000 |
| Subject: | com php-src: assert() user message: NEWS ext/standard/assert.c ext/standard/tests/assert/assert04.phpt ext/standard/tests/asse rt/assert_basic6.phpt ext/standard/tests/assert/assert _error1.phpt ext/standard/tests/assert/assert_error 2.phpt ext/standard/tests/assert/assert_error3.phpt ext/standard/tests/assert/assert_error4.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-70009@lists.php.net to get a copy of this message | ||
Commit: e658a91b3d826ea4104b17f3a6123c1e9f3aee86
Author: Lars Strojny <lstrojny@php.net> Fri, 31 Aug 2012 19:04:53 +0200
Parents: 66fad45724214c21491daa21031ac6e5a59d5e3a
Branches: PHP-5.4
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=e658a91b3d826ea4104b17f3a6123c1e9f3aee86
Log:
assert() user message
Added 2nd, optional, param to assert. When passed in it will be added
to the printed warnings and passed as a 4th param to a callback. PR 150
by Lonny Kapelushnik
Changed paths:
M NEWS
M ext/standard/assert.c
M ext/standard/tests/assert/assert04.phpt
A ext/standard/tests/assert/assert_basic6.phpt
M ext/standard/tests/assert/assert_error1.phpt
A ext/standard/tests/assert/assert_error2.phpt
A ext/standard/tests/assert/assert_error3.phpt
A ext/standard/tests/assert/assert_error4.phpt
diff --git a/NEWS b/NEWS index 97cb3d0..d88aa18 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,8 @@ PHP NEWS handler). (Lonny Kapelushnik) . Fixed bug #40459 (Stat and Dir stream wrapper methods do not call constructor). (Stas) + . Added optional second argument for assert() to specify custom message. Patch + by Lonny Kapelushnik (lonny@lonnylot.com). (Lars) - CURL: . Fixed bug #62912 (CURLINFO_PRIMARY_* AND CURLINFO_LOCAL_* not exposed). diff --git a/ext/standard/assert.c b/ext/standard/assert.c index a2c50d5..0ff3f9b 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -136,20 +136,20 @@ PHP_MINFO_FUNCTION(assert) /* {{{ */ } /* }}} */ -/* {{{ proto int assert(string|bool assertion) +/* {{{ proto int assert(string|bool assertion[, string description]) Checks if assertion is false */ PHP_FUNCTION(assert) { zval **assertion; - int val; + int val, description_len = 0; char *myeval = NULL; - char *compiled_string_description; + char *compiled_string_description, *description; if (! ASSERTG(active)) { RETURN_TRUE; } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &assertion) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|s", &assertion, &description, &description_len) == FAILURE) { return; } @@ -167,7 +167,11 @@ PHP_FUNCTION(assert) compiled_string_description = zend_make_compiled_string_description("assert code" TSRMLS_CC); if (zend_eval_stringl(myeval, Z_STRLEN_PP(assertion), &retval, compiled_string_description TSRMLS_CC) == FAILURE) { efree(compiled_string_description); - php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval); + if (description_len == 0) { + php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval); + } else { + php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s:\"%s\"", PHP_EOL, description, myeval); + } if (ASSERTG(bail)) { zend_bailout(); } @@ -196,7 +200,7 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval *args[3]; + zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval **), 0); zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C); @@ -214,19 +218,38 @@ PHP_FUNCTION(assert) ZVAL_FALSE(retval); /* XXX do we want to check for error here? */ - call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 3, args TSRMLS_CC); + if (description_len == 0) { + call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 3, args TSRMLS_CC); + for (i = 0; i <= 2; i++) { + zval_ptr_dtor(&(args[i])); + } + } else { + MAKE_STD_ZVAL(args[3]); + ZVAL_STRINGL(args[3], SAFE_STRING(description), description_len, 1); - for (i = 0; i <= 2; i++) { - zval_ptr_dtor(&(args[i])); + call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 4, args TSRMLS_CC); + for (i = 0; i <= 3; i++) { + zval_ptr_dtor(&(args[i])); + } } + + efree(args); zval_ptr_dtor(&retval); } if (ASSERTG(warning)) { - if (myeval) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval); + if (description_len == 0) { + if (myeval) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed"); + } } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed"); + if (myeval) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: \"%s\" failed", description, myeval); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s failed", description); + } } } @@ -321,3 +344,4 @@ PHP_FUNCTION(assert_options) * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */ + diff --git a/ext/standard/tests/assert/assert04.phpt b/ext/standard/tests/assert/assert04.phpt index 0da2318..bffadcb 100644 --- a/ext/standard/tests/assert/assert04.phpt +++ b/ext/standard/tests/assert/assert04.phpt @@ -15,7 +15,7 @@ assert(1); /* Wrong parameter count in assert */ assert_options(ASSERT_ACTIVE, 1); -assert(2,3); +assert(2, "failure", 3); /* Wrong parameter count in assert_options */ assert_options(ASSERT_ACTIVE, 0, 2); @@ -36,7 +36,7 @@ echo "not reached\n"; ?> --EXPECTF-- -Warning: assert() expects exactly 1 parameter, 2 given in %s on line %d +Warning: assert() expects at most 2 parameters, 3 given in %s on line %d Warning: assert_options() expects at most 2 parameters, 3 given in %s on line %d @@ -45,3 +45,4 @@ Warning: assert_options() expects parameter 1 to be long, %unicode_string_option Warning: assert(): Assertion failed in %s on line %d Warning: assert(): Assertion failed in %s on line %d + diff --git a/ext/standard/tests/assert/assert_basic6.phpt b/ext/standard/tests/assert/assert_basic6.phpt new file mode 100644 index 0000000..2a73713 --- /dev/null +++ b/ext/standard/tests/assert/assert_basic6.phpt @@ -0,0 +1,26 @@ +--TEST-- +assert() - basic - Test that bailout works +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 1 +assert.bail = 0 +--FILE-- +<?php +function f1($message) +{ + echo "f1 called\n"; +} + +//bail out on error +var_dump($rao = assert_options(ASSERT_BAIL, 1)); +$sa = "0 != 0"; +var_dump($r2 = assert($sa, "0 is 0")); +echo "If this is printed BAIL hasn't worked"; +--EXPECTF-- +int(0) +f1 called + +Warning: assert(): 0 is 0: "0 != 0" failed in %s on line 10 + diff --git a/ext/standard/tests/assert/assert_error1.phpt b/ext/standard/tests/assert/assert_error1.phpt index 6211f1c..657b411 100644 --- a/ext/standard/tests/assert/assert_error1.phpt +++ b/ext/standard/tests/assert/assert_error1.phpt @@ -20,19 +20,19 @@ function handler($errno, $errstr) { //Wrong number of parameters for assert_options() assert_options(ASSERT_WARNING, 1); -var_dump($rao=assert_options(ASSERT_CALLBACK,"f1",1)); +var_dump($rao = assert_options(ASSERT_CALLBACK, "f1", 1)); //Unknown option for assert_options() -var_dump($rao=assert_options("F1","f1")); +var_dump($rao=assert_options("F1", "f1")); //Wrong number of parameters for assert() $sa="0 != 0"; -var_dump($r2=assert($sa,1)); +var_dump($r2 = assert($sa, "message", 1)); //Catch recoverable error with handler -var_dump($rc=assert('aa=sd+as+safsafasfaçsafçsafç')); +var_dump($rc = assert('aa=sd+as+safsafasfaçsafçsafç')); --EXPECTF-- Warning: assert_options() expects at most 2 parameters, 3 given in %s on line %d NULL @@ -40,5 +40,6 @@ NULL Warning: assert_options() expects parameter 1 to be long, string given in %s on line %d NULL -Warning: assert() expects exactly 1 parameter, 2 given in %s on line %d +Warning: assert() expects at most 2 parameters, 3 given in %s on line %d NULL + diff --git a/ext/standard/tests/assert/assert_error2.phpt b/ext/standard/tests/assert/assert_error2.phpt new file mode 100644 index 0000000..da7c3d9 --- /dev/null +++ b/ext/standard/tests/assert/assert_error2.phpt @@ -0,0 +1,30 @@ +--TEST-- +assert() - basic - Test that bailout works +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 1 +assert.bail = 0 +error_reporting = -1 +display_errors = 1 +--FILE-- +<?php +function f1($script, $line, $message, $user_message) +{ + echo "f1 called\n"; +} + +//bail out on error +var_dump($rao = assert_options(ASSERT_BAIL, 1)); +$sa = "0 != 0"; +var_dump($r2 = assert($sa)); +echo "If this is printed BAIL hasn't worked"; +--EXPECTF-- +int(0) + +Warning: Missing argument 4 for f1() in %s on line 2 +f1 called + +Warning: assert(): Assertion "0 != 0" failed in %s on line 10 + diff --git a/ext/standard/tests/assert/assert_error3.phpt b/ext/standard/tests/assert/assert_error3.phpt new file mode 100644 index 0000000..54b91ed --- /dev/null +++ b/ext/standard/tests/assert/assert_error3.phpt @@ -0,0 +1,21 @@ +--TEST-- +assert() - basic - Test recoverable error +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 0 +assert.bail = 0 +error_reporting = -1 +display_errors = 1 +--FILE-- +<?php +$sa = "0 $ 0"; +var_dump($r2 = assert($sa)); +--EXPECTF-- + +Parse error: syntax error, unexpected '$' in %s(3) : assert code on line 1 + +Catchable fatal error: assert(): Failure evaluating code: +0 $ 0 in %s on line 3 + diff --git a/ext/standard/tests/assert/assert_error4.phpt b/ext/standard/tests/assert/assert_error4.phpt new file mode 100644 index 0000000..264cc8f --- /dev/null +++ b/ext/standard/tests/assert/assert_error4.phpt @@ -0,0 +1,21 @@ +--TEST-- +assert() - basic - Test recoverable error +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 0 +assert.bail = 0 +error_reporting = -1 +display_errors = 1 +--FILE-- +<?php +$sa = "0 $ 0"; +var_dump($r2 = assert($sa, "Describing what was asserted")); +--EXPECTF-- + +Parse error: syntax error, unexpected '$' in %s(3) : assert code on line 1 + +Catchable fatal error: assert(): Failure evaluating code: +Describing what was asserted:"0 $ 0" in %s on line 3 +
diff --git a/NEWS b/NEWS index 97cb3d0..d88aa18 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,8 @@ PHP NEWS handler). (Lonny Kapelushnik) . Fixed bug #40459 (Stat and Dir stream wrapper methods do not call constructor). (Stas) + . Added optional second argument for assert() to specify custom message. Patch + by Lonny Kapelushnik (lonny@lonnylot.com). (Lars) - CURL: . Fixed bug #62912 (CURLINFO_PRIMARY_* AND CURLINFO_LOCAL_* not exposed). diff --git a/ext/standard/assert.c b/ext/standard/assert.c index a2c50d5..0ff3f9b 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -136,20 +136,20 @@ PHP_MINFO_FUNCTION(assert) /* {{{ */ } /* }}} */ -/* {{{ proto int assert(string|bool assertion) +/* {{{ proto int assert(string|bool assertion[, string description]) Checks if assertion is false */ PHP_FUNCTION(assert) { zval **assertion; - int val; + int val, description_len = 0; char *myeval = NULL; - char *compiled_string_description; + char *compiled_string_description, *description; if (! ASSERTG(active)) { RETURN_TRUE; } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &assertion) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|s", &assertion, &description, &description_len) == FAILURE) { return; } @@ -167,7 +167,11 @@ PHP_FUNCTION(assert) compiled_string_description = zend_make_compiled_string_description("assert code" TSRMLS_CC); if (zend_eval_stringl(myeval, Z_STRLEN_PP(assertion), &retval, compiled_string_description TSRMLS_CC) == FAILURE) { efree(compiled_string_description); - php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval); + if (description_len == 0) { + php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval); + } else { + php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s:\"%s\"", PHP_EOL, description, myeval); + } if (ASSERTG(bail)) { zend_bailout(); } @@ -196,7 +200,7 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval *args[3]; + zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval **), 0); zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C); @@ -214,19 +218,38 @@ PHP_FUNCTION(assert) ZVAL_FALSE(retval); /* XXX do we want to check for error here? */ - call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 3, args TSRMLS_CC); + if (description_len == 0) { + call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 3, args TSRMLS_CC); + for (i = 0; i <= 2; i++) { + zval_ptr_dtor(&(args[i])); + } + } else { + MAKE_STD_ZVAL(args[3]); + ZVAL_STRINGL(args[3], SAFE_STRING(description), description_len, 1); - for (i = 0; i <= 2; i++) { - zval_ptr_dtor(&(args[i])); + call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 4, args TSRMLS_CC); + for (i = 0; i <= 3; i++) { + zval_ptr_dtor(&(args[i])); + } } + + efree(args); zval_ptr_dtor(&retval); } if (ASSERTG(warning)) { - if (myeval) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval); + if (description_len == 0) { + if (myeval) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed"); + } } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed"); + if (myeval) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: \"%s\" failed", description, myeval); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s failed", description); + } } } @@ -321,3 +344,4 @@ PHP_FUNCTION(assert_options) * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */ + diff --git a/ext/standard/tests/assert/assert04.phpt b/ext/standard/tests/assert/assert04.phpt index 0da2318..bffadcb 100644 --- a/ext/standard/tests/assert/assert04.phpt +++ b/ext/standard/tests/assert/assert04.phpt @@ -15,7 +15,7 @@ assert(1); /* Wrong parameter count in assert */ assert_options(ASSERT_ACTIVE, 1); -assert(2,3); +assert(2, "failure", 3); /* Wrong parameter count in assert_options */ assert_options(ASSERT_ACTIVE, 0, 2); @@ -36,7 +36,7 @@ echo "not reached\n"; ?> --EXPECTF-- -Warning: assert() expects exactly 1 parameter, 2 given in %s on line %d +Warning: assert() expects at most 2 parameters, 3 given in %s on line %d Warning: assert_options() expects at most 2 parameters, 3 given in %s on line %d @@ -45,3 +45,4 @@ Warning: assert_options() expects parameter 1 to be long, %unicode_string_option Warning: assert(): Assertion failed in %s on line %d Warning: assert(): Assertion failed in %s on line %d + diff --git a/ext/standard/tests/assert/assert_basic6.phpt b/ext/standard/tests/assert/assert_basic6.phpt new file mode 100644 index 0000000..2a73713 --- /dev/null +++ b/ext/standard/tests/assert/assert_basic6.phpt @@ -0,0 +1,26 @@ +--TEST-- +assert() - basic - Test that bailout works +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 1 +assert.bail = 0 +--FILE-- +<?php +function f1($message) +{ + echo "f1 called\n"; +} + +//bail out on error +var_dump($rao = assert_options(ASSERT_BAIL, 1)); +$sa = "0 != 0"; +var_dump($r2 = assert($sa, "0 is 0")); +echo "If this is printed BAIL hasn't worked"; +--EXPECTF-- +int(0) +f1 called + +Warning: assert(): 0 is 0: "0 != 0" failed in %s on line 10 + diff --git a/ext/standard/tests/assert/assert_error1.phpt b/ext/standard/tests/assert/assert_error1.phpt index 6211f1c..657b411 100644 --- a/ext/standard/tests/assert/assert_error1.phpt +++ b/ext/standard/tests/assert/assert_error1.phpt @@ -20,19 +20,19 @@ function handler($errno, $errstr) { //Wrong number of parameters for assert_options() assert_options(ASSERT_WARNING, 1); -var_dump($rao=assert_options(ASSERT_CALLBACK,"f1",1)); +var_dump($rao = assert_options(ASSERT_CALLBACK, "f1", 1)); //Unknown option for assert_options() -var_dump($rao=assert_options("F1","f1")); +var_dump($rao=assert_options("F1", "f1")); //Wrong number of parameters for assert() $sa="0 != 0"; -var_dump($r2=assert($sa,1)); +var_dump($r2 = assert($sa, "message", 1)); //Catch recoverable error with handler -var_dump($rc=assert('aa=sd+as+safsafasfaçsafçsafç')); +var_dump($rc = assert('aa=sd+as+safsafasfaçsafçsafç')); --EXPECTF-- Warning: assert_options() expects at most 2 parameters, 3 given in %s on line %d NULL @@ -40,5 +40,6 @@ NULL Warning: assert_options() expects parameter 1 to be long, string given in %s on line %d NULL -Warning: assert() expects exactly 1 parameter, 2 given in %s on line %d +Warning: assert() expects at most 2 parameters, 3 given in %s on line %d NULL + diff --git a/ext/standard/tests/assert/assert_error2.phpt b/ext/standard/tests/assert/assert_error2.phpt new file mode 100644 index 0000000..da7c3d9 --- /dev/null +++ b/ext/standard/tests/assert/assert_error2.phpt @@ -0,0 +1,30 @@ +--TEST-- +assert() - basic - Test that bailout works +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 1 +assert.bail = 0 +error_reporting = -1 +display_errors = 1 +--FILE-- +<?php +function f1($script, $line, $message, $user_message) +{ + echo "f1 called\n"; +} + +//bail out on error +var_dump($rao = assert_options(ASSERT_BAIL, 1)); +$sa = "0 != 0"; +var_dump($r2 = assert($sa)); +echo "If this is printed BAIL hasn't worked"; +--EXPECTF-- +int(0) + +Warning: Missing argument 4 for f1() in %s on line 2 +f1 called + +Warning: assert(): Assertion "0 != 0" failed in %s on line 10 + diff --git a/ext/standard/tests/assert/assert_error3.phpt b/ext/standard/tests/assert/assert_error3.phpt new file mode 100644 index 0000000..54b91ed --- /dev/null +++ b/ext/standard/tests/assert/assert_error3.phpt @@ -0,0 +1,21 @@ +--TEST-- +assert() - basic - Test recoverable error +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 0 +assert.bail = 0 +error_reporting = -1 +display_errors = 1 +--FILE-- +<?php +$sa = "0 $ 0"; +var_dump($r2 = assert($sa)); +--EXPECTF-- + +Parse error: syntax error, unexpected '$' in %s(3) : assert code on line 1 + +Catchable fatal error: assert(): Failure evaluating code: +0 $ 0 in %s on line 3 + diff --git a/ext/standard/tests/assert/assert_error4.phpt b/ext/standard/tests/assert/assert_error4.phpt new file mode 100644 index 0000000..264cc8f --- /dev/null +++ b/ext/standard/tests/assert/assert_error4.phpt @@ -0,0 +1,21 @@ +--TEST-- +assert() - basic - Test recoverable error +--INI-- +assert.active = 1 +assert.warning = 1 +assert.callback = f1 +assert.quiet_eval = 0 +assert.bail = 0 +error_reporting = -1 +display_errors = 1 +--FILE-- +<?php +$sa = "0 $ 0"; +var_dump($r2 = assert($sa, "Describing what was asserted")); +--EXPECTF-- + +Parse error: syntax error, unexpected '$' in %s(3) : assert code on line 1 + +Catchable fatal error: assert(): Failure evaluating code: +Describing what was asserted:"0 $ 0" in %s on line 3 +