diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt | 8 | ||||
| -rw-r--r-- | ext/opcache/Optimizer/block_pass.c | 2 | ||||
| -rw-r--r-- | ext/opcache/Optimizer/nop_removal.c | 1 | ||||
| -rw-r--r-- | ext/opcache/Optimizer/pass1_5.c | 1 | ||||
| -rw-r--r-- | ext/opcache/Optimizer/zend_optimizer.c | 2 | ||||
| -rw-r--r-- | ext/opcache/zend_persist.c | 1 | ||||
| -rw-r--r-- | ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt | 4 | ||||
| -rw-r--r-- | ext/standard/assert.c | 72 | ||||
| -rw-r--r-- | ext/standard/tests/assert/assert04.phpt | 4 | ||||
| -rw-r--r-- | ext/standard/tests/assert/assert_basic2.phpt | 4 | ||||
| -rw-r--r-- | ext/standard/tests/assert/assert_basic3.phpt | 2 | ||||
| -rw-r--r-- | ext/standard/tests/assert/assert_basic5.phpt | 2 | ||||
| -rw-r--r-- | ext/standard/tests/assert/assert_closures.phpt | 2 | ||||
| -rw-r--r-- | ext/standard/tests/assert/assert_error2.phpt | 5 | ||||
| -rw-r--r-- | ext/standard/tests/assert/assert_error3.phpt | 7 |
15 files changed, 81 insertions, 36 deletions
diff --git a/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt index e4d0b08a85..7e36c6571e 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt @@ -188,7 +188,7 @@ warning_count = 'NULL' Magic, magic properties: mysqli->affected_rows = ''/NULL (''/NULL) -Warning: assert(): Assertion failed in %s on line %d +Warning: assert(): assert(@mysqli_get_client_info() === @$mysqli->client_info) failed in %s on line %d mysqli->client_info = ''/NULL ('%s'/%s) mysqli->client_version = '%s'/integer ('%s'/integer) mysqli->errno = ''/NULL (''/NULL) @@ -199,7 +199,7 @@ mysqli->sqlstate = ''/NULL (''/NULL) mysqli->host_info = ''/NULL (''/NULL) mysqli->info = ''/NULL (''/NULL) -Warning: assert(): Assertion failed in %s on line %d +Warning: assert(): assert(@mysqli_thread_id($mysqli) > @$mysqli->thread_id) failed in %s on line %d mysqli->thread_id = ''/NULL (''/NULL) mysqli->protocol_version = ''/NULL (''/NULL) mysqli->server_info = ''/NULL (''/NULL) @@ -261,7 +261,7 @@ warning_count = 'NULL' Magic, magic properties: mysqli->affected_rows = ''/NULL (''/NULL) -Warning: assert(): Assertion failed in %s on line %d +Warning: assert(): assert(@mysqli_get_client_info() === @$mysqli->client_info) failed in %s on line %d mysqli->client_info = ''/NULL ('%s'/%s) mysqli->client_version = '%s'/integer ('%s'/integer) mysqli->errno = ''/NULL (''/NULL) @@ -272,7 +272,7 @@ mysqli->sqlstate = ''/NULL (''/NULL) mysqli->host_info = ''/NULL (''/NULL) mysqli->info = ''/NULL (''/NULL) -Warning: assert(): Assertion failed in %s on line %d +Warning: assert(): assert(@mysqli_thread_id($mysqli) > @$mysqli->thread_id) failed in %s on line %d mysqli->thread_id = ''/NULL (''/NULL) mysqli->protocol_version = ''/NULL (''/NULL) mysqli->server_info = ''/NULL (''/NULL) diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 0922d6e809..3e3c16558a 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -171,6 +171,7 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz case ZEND_NEW: case ZEND_JMP_SET: case ZEND_COALESCE: + case ZEND_ASSERT_CHECK: START_BLOCK_OP(ZEND_OP2(opline).opline_num); START_BLOCK_OP(opno + 1); break; @@ -306,6 +307,7 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz case ZEND_COALESCE: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: + case ZEND_ASSERT_CHECK: cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num]; /* break missing intentionally */ default: diff --git a/ext/opcache/Optimizer/nop_removal.c b/ext/opcache/Optimizer/nop_removal.c index dccd010ae4..061d2bb89f 100644 --- a/ext/opcache/Optimizer/nop_removal.c +++ b/ext/opcache/Optimizer/nop_removal.c @@ -100,6 +100,7 @@ void zend_optimizer_nop_removal(zend_op_array *op_array) case ZEND_NEW: case ZEND_JMP_SET: case ZEND_COALESCE: + case ZEND_ASSERT_CHECK: ZEND_OP2(opline).opline_num -= shiftlist[ZEND_OP2(opline).opline_num]; break; case ZEND_JMPZNZ: diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 990b845d43..5bff6ab3a8 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -609,6 +609,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) case ZEND_NEW: case ZEND_JMP_SET: case ZEND_COALESCE: + case ZEND_ASSERT_CHECK: collect_constants = 0; break; case ZEND_FETCH_R: diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 1941a56dfa..7be076cb7f 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -495,6 +495,7 @@ static void zend_accel_optimize(zend_op_array *op_array, case ZEND_FE_RESET_RW: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: + case ZEND_ASSERT_CHECK: ZEND_PASS_TWO_UNDO_JMP_TARGET(op_array, opline, ZEND_OP2(opline)); break; } @@ -535,6 +536,7 @@ static void zend_accel_optimize(zend_op_array *op_array, case ZEND_FE_RESET_RW: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: + case ZEND_ASSERT_CHECK: ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, ZEND_OP2(opline)); break; } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 9a929be6ab..c0cd5b270b 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -451,6 +451,7 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc case ZEND_FE_RESET_RW: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: + case ZEND_ASSERT_CHECK: ZEND_OP2(opline).jmp_addr = &new_opcodes[ZEND_OP2(opline).jmp_addr - op_array->opcodes]; break; } diff --git a/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt b/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt index dfec951f79..0728d505c3 100644 --- a/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt +++ b/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt @@ -9,12 +9,14 @@ var_dump($standard->getClassNames()); ?> ==DONE== --EXPECTF-- -array(3) { +array(4) { [0]=> %s(22) "__PHP_Incomplete_Class" [1]=> %s(15) "php_user_filter" [2]=> %s(9) "Directory" + [3]=> + %s(18) "AssertionException" } ==DONE== diff --git a/ext/standard/assert.c b/ext/standard/assert.c index 15803fa075..3eb870dd67 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -22,6 +22,7 @@ #include "php.h" #include "php_assert.h" #include "php_ini.h" +#include "zend_exceptions.h" /* }}} */ ZEND_BEGIN_MODULE_GLOBALS(assert) @@ -31,10 +32,13 @@ ZEND_BEGIN_MODULE_GLOBALS(assert) zend_bool bail; zend_bool warning; zend_bool quiet_eval; + zend_bool exception; ZEND_END_MODULE_GLOBALS(assert) ZEND_DECLARE_MODULE_GLOBALS(assert) +static zend_class_entry *assertion_exception_ce; + #ifdef ZTS #define ASSERTG(v) ZEND_TSRMG(assert_globals_id, zend_assert_globals *, v) #else @@ -48,7 +52,8 @@ enum { ASSERT_CALLBACK, ASSERT_BAIL, ASSERT_WARNING, - ASSERT_QUIET_EVAL + ASSERT_QUIET_EVAL, + ASSERT_EXCEPTION }; static PHP_INI_MH(OnChangeCallback) /* {{{ */ @@ -83,6 +88,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("assert.warning", "1", PHP_INI_ALL, OnUpdateBool, warning, zend_assert_globals, assert_globals) PHP_INI_ENTRY("assert.callback", NULL, PHP_INI_ALL, OnChangeCallback) STD_PHP_INI_ENTRY("assert.quiet_eval", "0", PHP_INI_ALL, OnUpdateBool, quiet_eval, zend_assert_globals, assert_globals) + STD_PHP_INI_ENTRY("assert.exception", "0", PHP_INI_ALL, OnUpdateBool, exception, zend_assert_globals, assert_globals) PHP_INI_END() static void php_assert_init_globals(zend_assert_globals *assert_globals_p) /* {{{ */ @@ -94,6 +100,8 @@ static void php_assert_init_globals(zend_assert_globals *assert_globals_p) /* {{ PHP_MINIT_FUNCTION(assert) /* {{{ */ { + zend_class_entry ce; + ZEND_INIT_MODULE_GLOBALS(assert, php_assert_init_globals, NULL); REGISTER_INI_ENTRIES(); @@ -103,6 +111,10 @@ PHP_MINIT_FUNCTION(assert) /* {{{ */ REGISTER_LONG_CONSTANT("ASSERT_BAIL", ASSERT_BAIL, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("ASSERT_WARNING", ASSERT_WARNING, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("ASSERT_QUIET_EVAL", ASSERT_QUIET_EVAL, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ASSERT_EXCEPTION", ASSERT_EXCEPTION, CONST_CS|CONST_PERSISTENT); + + INIT_CLASS_ENTRY(ce, "AssertionException", NULL); + assertion_exception_ce = zend_register_internal_class_ex(&ce, zend_exception_get_default(TSRMLS_C)); return SUCCESS; } @@ -135,21 +147,21 @@ PHP_MINFO_FUNCTION(assert) /* {{{ */ } /* }}} */ -/* {{{ proto int assert(string|bool assertion[, string description]) +/* {{{ proto int assert(string|bool assertion[, mixed description]) Checks if assertion is false */ PHP_FUNCTION(assert) { zval *assertion; + zval *description = NULL; int val; - size_t description_len = 0; char *myeval = NULL; - char *compiled_string_description, *description = NULL; + char *compiled_string_description; if (! ASSERTG(active)) { RETURN_TRUE; } - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|s", &assertion, &description, &description_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|z", &assertion, &description) == FAILURE) { return; } @@ -167,10 +179,12 @@ PHP_FUNCTION(assert) compiled_string_description = zend_make_compiled_string_description("assert code"); if (zend_eval_stringl(myeval, Z_STRLEN_P(assertion), &retval, compiled_string_description) == FAILURE) { efree(compiled_string_description); - if (description_len == 0) { + if (!description) { php_error_docref(NULL, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval); } else { - php_error_docref(NULL, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s:\"%s\"", PHP_EOL, description, myeval); + zend_string *str = zval_get_string(description); + php_error_docref(NULL, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s:\"%s\"", PHP_EOL, str->val, myeval); + zend_string_release(str); } if (ASSERTG(bail)) { zend_bailout(); @@ -186,8 +200,7 @@ PHP_FUNCTION(assert) convert_to_boolean(&retval); val = Z_TYPE(retval) == IS_TRUE; } else { - convert_to_boolean_ex(assertion); - val = Z_TYPE_P(assertion) == IS_TRUE; + val = zend_is_true(assertion); } if (val) { @@ -199,7 +212,7 @@ PHP_FUNCTION(assert) } if (Z_TYPE(ASSERTG(callback)) != IS_UNDEF) { - zval *args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval), 0); + zval *args = safe_emalloc(!description ? 3 : 4, sizeof(zval), 0); zval retval; int i; uint lineno = zend_get_executed_lineno(); @@ -212,14 +225,13 @@ PHP_FUNCTION(assert) ZVAL_FALSE(&retval); /* XXX do we want to check for error here? */ - if (description_len == 0) { + if (!description) { call_user_function(CG(function_table), NULL, &ASSERTG(callback), &retval, 3, args); for (i = 0; i <= 2; i++) { zval_ptr_dtor(&(args[i])); } } else { - ZVAL_STRINGL(&args[3], SAFE_STRING(description), description_len); - + ZVAL_STR(&args[3], zval_get_string(description)); call_user_function(CG(function_table), NULL, &ASSERTG(callback), &retval, 4, args); for (i = 0; i <= 3; i++) { zval_ptr_dtor(&(args[i])); @@ -230,19 +242,33 @@ PHP_FUNCTION(assert) zval_ptr_dtor(&retval); } - if (ASSERTG(warning)) { - if (description_len == 0) { + if (ASSERTG(exception)) { + if (!description) { + zend_throw_exception(assertion_exception_ce, NULL, E_ERROR TSRMLS_CC); + } else if (Z_TYPE_P(description) == IS_OBJECT && + instanceof_function(Z_OBJCE_P(description), assertion_exception_ce TSRMLS_CC)) { + Z_ADDREF_P(description); + zend_throw_exception_object(description TSRMLS_CC); + } else { + zend_string *str = zval_get_string(description); + zend_throw_exception(assertion_exception_ce, str->val, E_ERROR TSRMLS_CC); + zend_string_release(str); + } + } else if (ASSERTG(warning)) { + if (!description) { if (myeval) { php_error_docref(NULL, E_WARNING, "Assertion \"%s\" failed", myeval); } else { php_error_docref(NULL, E_WARNING, "Assertion failed"); } } else { + zend_string *str = zval_get_string(description); if (myeval) { - php_error_docref(NULL, E_WARNING, "%s: \"%s\" failed", description, myeval); + php_error_docref(NULL, E_WARNING, "%s: \"%s\" failed", str->val, myeval); } else { - php_error_docref(NULL, E_WARNING, "%s failed", description); + php_error_docref(NULL, E_WARNING, "%s failed", str->val); } + zend_string_release(str); } } @@ -329,6 +355,18 @@ PHP_FUNCTION(assert_options) } return; + case ASSERT_EXCEPTION: + oldint = ASSERTG(exception); + if (ac == 2) { + zend_string *key = zend_string_init("assert.exception", sizeof("assert.exception")-1, 0); + zend_string *val = zval_get_string(value); + zend_alter_ini_entry_ex(key, val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC); + zend_string_release(val); + zend_string_release(key); + } + RETURN_LONG(oldint); + break; + default: php_error_docref(NULL, E_WARNING, "Unknown value %pd", what); break; diff --git a/ext/standard/tests/assert/assert04.phpt b/ext/standard/tests/assert/assert04.phpt index 12efef97e2..53f8d92167 100644 --- a/ext/standard/tests/assert/assert04.phpt +++ b/ext/standard/tests/assert/assert04.phpt @@ -42,7 +42,7 @@ Warning: assert_options() expects at most 2 parameters, 3 given in %s on line %d Warning: assert_options() expects parameter 1 to be integer, %unicode_string_optional% given in %s on line %d -Warning: assert(): Assertion failed in %s on line %d +Warning: assert(): assert(0) failed in %s on line %d -Warning: assert(): Assertion failed in %s on line %d +Warning: assert(): assert(0) failed in %s on line %d diff --git a/ext/standard/tests/assert/assert_basic2.phpt b/ext/standard/tests/assert/assert_basic2.phpt index 277e5cad18..42c59b1b9a 100644 --- a/ext/standard/tests/assert/assert_basic2.phpt +++ b/ext/standard/tests/assert/assert_basic2.phpt @@ -29,9 +29,9 @@ assert(0); string(2) "f1" f1 called -Warning: assert(): Assertion failed in %s on line 13 +Warning: assert(): assert(0) failed in %s on line 13 string(2) "f1" string(2) "f2" f2 called -Warning: assert(): Assertion failed in %s on line 17 +Warning: assert(): assert(0) failed in %s on line 17 diff --git a/ext/standard/tests/assert/assert_basic3.phpt b/ext/standard/tests/assert/assert_basic3.phpt index 0ce326606f..9fcbbd5c3c 100644 --- a/ext/standard/tests/assert/assert_basic3.phpt +++ b/ext/standard/tests/assert/assert_basic3.phpt @@ -22,4 +22,4 @@ echo "If this is printed BAIL hasn't worked"; int(0) f1 called -Warning: assert(): Assertion "0 != 0" failed in %s on line 10 +Warning: assert(): assert($sa): "0 != 0" failed in %s on line 10 diff --git a/ext/standard/tests/assert/assert_basic5.phpt b/ext/standard/tests/assert/assert_basic5.phpt index 737f902d64..d67d879262 100644 --- a/ext/standard/tests/assert/assert_basic5.phpt +++ b/ext/standard/tests/assert/assert_basic5.phpt @@ -26,7 +26,7 @@ var_dump($rao=assert_options(ASSERT_WARNING, 0)); int(0) f1 called -Warning: assert(): Assertion "0 != 0" failed in %s on line 10 +Warning: assert(): assert($sa): "0 != 0" failed in %s on line 10 NULL bool(true) int(1) diff --git a/ext/standard/tests/assert/assert_closures.phpt b/ext/standard/tests/assert/assert_closures.phpt index e01c11ace9..4a013283a8 100644 --- a/ext/standard/tests/assert/assert_closures.phpt +++ b/ext/standard/tests/assert/assert_closures.phpt @@ -13,4 +13,4 @@ assert(0); --EXPECTF-- Hello World! -Warning: assert(): Assertion failed in %s on line %d +Warning: assert(): assert(0) failed in %s on line %d diff --git a/ext/standard/tests/assert/assert_error2.phpt b/ext/standard/tests/assert/assert_error2.phpt index da7c3d9e0b..41a7197535 100644 --- a/ext/standard/tests/assert/assert_error2.phpt +++ b/ext/standard/tests/assert/assert_error2.phpt @@ -17,8 +17,7 @@ function f1($script, $line, $message, $user_message) //bail out on error var_dump($rao = assert_options(ASSERT_BAIL, 1)); -$sa = "0 != 0"; -var_dump($r2 = assert($sa)); +var_dump($r2 = assert("0 != 0")); echo "If this is printed BAIL hasn't worked"; --EXPECTF-- int(0) @@ -26,5 +25,5 @@ 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 +Warning: assert(): Assertion "0 != 0" failed in %s on line 9 diff --git a/ext/standard/tests/assert/assert_error3.phpt b/ext/standard/tests/assert/assert_error3.phpt index 6df2fe4e26..d14397515f 100644 --- a/ext/standard/tests/assert/assert_error3.phpt +++ b/ext/standard/tests/assert/assert_error3.phpt @@ -10,12 +10,11 @@ error_reporting = -1 display_errors = 1 --FILE-- <?php -$sa = "0 $ 0"; -var_dump($r2 = assert($sa)); +var_dump($r2 = assert("0 $ 0")); --EXPECTF-- -Parse error: syntax error, %s in %s(3) : assert code on line 1 +Parse error: syntax error, unexpected '$', expecting ';' in %s(2) : assert code on line 1 Catchable fatal error: assert(): Failure evaluating code: -0 $ 0 in %s on line 3 +0 $ 0 in %s on line 2 |
