Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The leading space before description_len is wrong here

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