--- embedaddon/php/ext/standard/assert.c	2012/02/21 23:48:02	1.1.1.1
+++ embedaddon/php/ext/standard/assert.c	2013/07/22 01:32:04	1.1.1.3
@@ -2,7 +2,7 @@
    +----------------------------------------------------------------------+
    | PHP Version 5                                                        |
    +----------------------------------------------------------------------+
-   | Copyright (c) 1997-2012 The PHP Group                                |
+   | Copyright (c) 1997-2013 The PHP Group                                |
    +----------------------------------------------------------------------+
    | This source file is subject to version 3.01 of the PHP license,      |
    | that is bundled with this package in the file LICENSE, and is        |
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: assert.c,v 1.1.1.1 2012/02/21 23:48:02 misho Exp $ */
+/* $Id: assert.c,v 1.1.1.3 2013/07/22 01:32:04 misho Exp $ */
 
 /* {{{ includes */
 #include "php.h"
@@ -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 = NULL;
 
 	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;
 	}
 
@@ -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();
 			}
@@ -196,11 +200,11 @@ 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);
-		char *filename = zend_get_executed_filename(TSRMLS_C);
+		const char *filename = zend_get_executed_filename(TSRMLS_C);
 
 		MAKE_STD_ZVAL(args[0]);
 		MAKE_STD_ZVAL(args[1]);
@@ -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);
+			}
 		}
 	}
 
@@ -321,3 +344,4 @@ PHP_FUNCTION(assert_options)
  * vim600: sw=4 ts=4 fdm=marker
  * vim<600: sw=4 ts=4
  */
+