Skip to content

Request 29463 assert() user message #150

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 36 additions & 12 deletions ext/standard/assert.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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();
}
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
}
}

Expand Down Expand Up @@ -321,3 +344,4 @@ PHP_FUNCTION(assert_options)
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/

5 changes: 3 additions & 2 deletions ext/standard/tests/assert/assert04.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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

Expand All @@ -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

26 changes: 26 additions & 0 deletions ext/standard/tests/assert/assert_basic6.phpt
Original file line number Diff line number Diff line change
@@ -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

11 changes: 6 additions & 5 deletions ext/standard/tests/assert/assert_error1.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,26 @@ 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

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

30 changes: 30 additions & 0 deletions ext/standard/tests/assert/assert_error2.phpt
Original file line number Diff line number Diff line change
@@ -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

21 changes: 21 additions & 0 deletions ext/standard/tests/assert/assert_error3.phpt
Original file line number Diff line number Diff line change
@@ -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

21 changes: 21 additions & 0 deletions ext/standard/tests/assert/assert_error4.phpt
Original file line number Diff line number Diff line change
@@ -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