From 6965c831d0c20ce38ca9dc86d47d47ae78011989 Mon Sep 17 00:00:00 2001 From: Lonny Kapelushnik Date: Tue, 7 Aug 2012 13:53:46 +0000 Subject: [PATCH 1/4] Request 29463 assert() add description param 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 --- ext/standard/assert.c | 51 ++++++++++++++------ ext/standard/tests/assert/assert04.phpt | 5 +- ext/standard/tests/assert/assert_basic6.phpt | 26 ++++++++++ ext/standard/tests/assert/assert_error1.phpt | 5 +- ext/standard/tests/assert/assert_error2.phpt | 30 ++++++++++++ ext/standard/tests/assert/assert_error3.phpt | 21 ++++++++ ext/standard/tests/assert/assert_error4.phpt | 21 ++++++++ 7 files changed, 141 insertions(+), 18 deletions(-) create mode 100644 ext/standard/tests/assert/assert_basic6.phpt create mode 100644 ext/standard/tests/assert/assert_error2.phpt create mode 100644 ext/standard/tests/assert/assert_error3.phpt create mode 100644 ext/standard/tests/assert/assert_error4.phpt diff --git a/ext/standard/assert.c b/ext/standard/assert.c index a2c50d5cb6772..1e6c5c379a028 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, descriptionlen = 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, &descriptionlen) == 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 (descriptionlen == 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,12 +200,15 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval *args[3]; + zval *args[descriptionlen == 0?3:4]; zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C); const char *filename = zend_get_executed_filename(TSRMLS_C); - + if (descriptionlen != 0) { + MAKE_STD_ZVAL(args[3]); + ZVAL_STRINGL(args[3], SAFE_STRING(description), descriptionlen, 1); + } MAKE_STD_ZVAL(args[0]); MAKE_STD_ZVAL(args[1]); MAKE_STD_ZVAL(args[2]); @@ -214,19 +221,34 @@ 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); - - for (i = 0; i <= 2; i++) { - zval_ptr_dtor(&(args[i])); + if (descriptionlen == 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 { + 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])); + } } + zval_ptr_dtor(&retval); } if (ASSERTG(warning)) { - if (myeval) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval); + if (descriptionlen == 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 +343,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 0da23186e6432..ff5e3e4204a46 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 0000000000000..c205d00220270 --- /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-- + Date: Tue, 28 Aug 2012 01:09:52 +0000 Subject: [PATCH 2/4] Made modifications that Lars Strojny requested --- ext/standard/assert.c | 16 ++++++++-------- ext/standard/tests/assert/assert_basic6.phpt | 4 ++-- ext/standard/tests/assert/assert_error2.phpt | 4 ++-- ext/standard/tests/assert/assert_error4.phpt | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ext/standard/assert.c b/ext/standard/assert.c index 1e6c5c379a028..0e2c8822933a2 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -141,7 +141,7 @@ PHP_MINFO_FUNCTION(assert) /* {{{ */ PHP_FUNCTION(assert) { zval **assertion; - int val, descriptionlen = 0; + int val, description_len = 0; char *myeval = NULL; char *compiled_string_description, *description; @@ -149,7 +149,7 @@ PHP_FUNCTION(assert) RETURN_TRUE; } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|s", &assertion, &description, &descriptionlen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|s", &assertion, &description, &description_len) == FAILURE) { return; } @@ -167,7 +167,7 @@ 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); - if (descriptionlen == 0) { + 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); @@ -200,14 +200,14 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval *args[descriptionlen == 0?3:4]; + zval *args[ description_len == 0?3:4 ]; zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C); const char *filename = zend_get_executed_filename(TSRMLS_C); - if (descriptionlen != 0) { + if (description_len != 0) { MAKE_STD_ZVAL(args[3]); - ZVAL_STRINGL(args[3], SAFE_STRING(description), descriptionlen, 1); + ZVAL_STRINGL(args[3], SAFE_STRING(description), description_len, 1); } MAKE_STD_ZVAL(args[0]); MAKE_STD_ZVAL(args[1]); @@ -221,7 +221,7 @@ PHP_FUNCTION(assert) ZVAL_FALSE(retval); /* XXX do we want to check for error here? */ - if (descriptionlen == 0) { + 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])); @@ -237,7 +237,7 @@ PHP_FUNCTION(assert) } if (ASSERTG(warning)) { - if (descriptionlen == 0) { + if (description_len == 0) { if (myeval) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval); } else { diff --git a/ext/standard/tests/assert/assert_basic6.phpt b/ext/standard/tests/assert/assert_basic6.phpt index c205d00220270..4b6b9d86d38cc 100644 --- a/ext/standard/tests/assert/assert_basic6.phpt +++ b/ext/standard/tests/assert/assert_basic6.phpt @@ -14,9 +14,9 @@ function f1($message) } //bail out on error -var_dump($rao=assert_options(ASSERT_BAIL, 1)); +var_dump($rao = assert_options(ASSERT_BAIL, 1)); $sa = "0 != 0"; -var_dump($r2=assert($sa,"0 is 0")); +var_dump($r2 = assert($sa, "0 is 0")); echo "If this is printed BAIL hasn't worked"; --EXPECTF-- int(0) diff --git a/ext/standard/tests/assert/assert_error2.phpt b/ext/standard/tests/assert/assert_error2.phpt index b1bf15cb34fcf..da7c3d9e0bbbc 100644 --- a/ext/standard/tests/assert/assert_error2.phpt +++ b/ext/standard/tests/assert/assert_error2.phpt @@ -16,9 +16,9 @@ function f1($script, $line, $message, $user_message) } //bail out on error -var_dump($rao=assert_options(ASSERT_BAIL, 1)); +var_dump($rao = assert_options(ASSERT_BAIL, 1)); $sa = "0 != 0"; -var_dump($r2=assert($sa)); +var_dump($r2 = assert($sa)); echo "If this is printed BAIL hasn't worked"; --EXPECTF-- int(0) diff --git a/ext/standard/tests/assert/assert_error4.phpt b/ext/standard/tests/assert/assert_error4.phpt index 13e64e75affbd..264cc8fecf6f7 100644 --- a/ext/standard/tests/assert/assert_error4.phpt +++ b/ext/standard/tests/assert/assert_error4.phpt @@ -11,7 +11,7 @@ display_errors = 1 --FILE-- Date: Wed, 29 Aug 2012 19:51:34 -0400 Subject: [PATCH 3/4] Made additional modifications per Lars request --- ext/standard/assert.c | 27 ++++++++++---------- ext/standard/tests/assert/assert04.phpt | 2 +- ext/standard/tests/assert/assert_error1.phpt | 8 +++--- ext/standard/tests/assert/assert_error3.phpt | 2 +- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/ext/standard/assert.c b/ext/standard/assert.c index 0e2c8822933a2..d01008b4a29e4 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -200,15 +200,12 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval *args[ description_len == 0?3:4 ]; + zval **args = safe_emalloc( description_len == 0 ? 3 : 4, sizeof(zval **), 0); zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C); const char *filename = zend_get_executed_filename(TSRMLS_C); - if (description_len != 0) { - MAKE_STD_ZVAL(args[3]); - ZVAL_STRINGL(args[3], SAFE_STRING(description), description_len, 1); - } + MAKE_STD_ZVAL(args[0]); MAKE_STD_ZVAL(args[1]); MAKE_STD_ZVAL(args[2]); @@ -227,28 +224,32 @@ PHP_FUNCTION(assert) zval_ptr_dtor(&(args[i])); } } else { + MAKE_STD_ZVAL(args[3]); + ZVAL_STRINGL(args[3], SAFE_STRING(description), description_len, 1); + 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 (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"); - } + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed"); + } } else { 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); - } + 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); + } } } diff --git a/ext/standard/tests/assert/assert04.phpt b/ext/standard/tests/assert/assert04.phpt index ff5e3e4204a46..bffadcb97c6e7 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,"failure",3); +assert(2, "failure", 3); /* Wrong parameter count in assert_options */ assert_options(ASSERT_ACTIVE, 0, 2); diff --git a/ext/standard/tests/assert/assert_error1.phpt b/ext/standard/tests/assert/assert_error1.phpt index c82c5f9882a02..657b411f67e2d 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,"message",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 diff --git a/ext/standard/tests/assert/assert_error3.phpt b/ext/standard/tests/assert/assert_error3.phpt index b12afa0705e0d..54b91edd3d93e 100644 --- a/ext/standard/tests/assert/assert_error3.phpt +++ b/ext/standard/tests/assert/assert_error3.phpt @@ -11,7 +11,7 @@ display_errors = 1 --FILE-- Date: Thu, 30 Aug 2012 14:33:47 +0000 Subject: [PATCH 4/4] Fixed spacing issue --- ext/standard/assert.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/assert.c b/ext/standard/assert.c index d01008b4a29e4..eaa1dc9bcfe60 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -200,7 +200,7 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval **args = safe_emalloc( description_len == 0 ? 3 : 4, sizeof(zval **), 0); + zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval **), 0); zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C);