summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt8
-rw-r--r--ext/opcache/Optimizer/block_pass.c2
-rw-r--r--ext/opcache/Optimizer/nop_removal.c1
-rw-r--r--ext/opcache/Optimizer/pass1_5.c1
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c2
-rw-r--r--ext/opcache/zend_persist.c1
-rw-r--r--ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt4
-rw-r--r--ext/standard/assert.c72
-rw-r--r--ext/standard/tests/assert/assert04.phpt4
-rw-r--r--ext/standard/tests/assert/assert_basic2.phpt4
-rw-r--r--ext/standard/tests/assert/assert_basic3.phpt2
-rw-r--r--ext/standard/tests/assert/assert_basic5.phpt2
-rw-r--r--ext/standard/tests/assert/assert_closures.phpt2
-rw-r--r--ext/standard/tests/assert/assert_error2.phpt5
-rw-r--r--ext/standard/tests/assert/assert_error3.phpt7
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