com php-src: Allow T_POW in constant expressions: Z end/tests/constant_expressions.phpt Zend/zend_ast.c Zend/zend_language_parser.y
| From: | Bob Weinand | Date: | Fri, 07 Mar 2014 01:14:27 +0000 |
| Subject: | com php-src: Allow T_POW in constant expressions: Z end/tests/constant_expressions.phpt Zend/zend_ast.c Zend/zend_language_parser.y | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-76378@lists.php.net to get a copy of this message | ||
Commit: 3d1fa4cb17038e530561a7a20c1b9497cec68f92
Author: Tjerk Meesters <datibbaw@php.net> Thu, 6 Mar 2014 08:31:01 +0800
Parents: d32e180f2068296bc8f1c06c71e2d805cccef8d1
Branches: PHP-5.6
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=3d1fa4cb17038e530561a7a20c1b9497cec68f92
Log:
Allow T_POW in constant expressions
Changed paths:
M Zend/tests/constant_expressions.phpt
M Zend/zend_ast.c
M Zend/zend_language_parser.y
Diff:
diff --git a/Zend/tests/constant_expressions.phpt b/Zend/tests/constant_expressions.phpt
index 7dea0d8..cf6474b 100644
--- a/Zend/tests/constant_expressions.phpt
+++ b/Zend/tests/constant_expressions.phpt
@@ -35,6 +35,9 @@ const T_25 = 1 + 2 * 3;
// Test for memory leaks
const T_26 = "1" + 2 + "3";
+// Allow T_POW
+const T_27 = 2 ** 3;
+
var_dump(T_1);
var_dump(T_2);
var_dump(T_3);
@@ -61,6 +64,7 @@ var_dump(T_23);
var_dump(T_24);
var_dump(T_25);
var_dump(T_26);
+var_dump(T_27);
?>
--EXPECT--
int(2)
@@ -89,3 +93,4 @@ bool(false)
bool(true)
int(7)
int(6)
+int(8)
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index cf595b4..9a0808d 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -107,6 +107,13 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry
*s
zval_dtor(&op1);
zval_dtor(&op2);
break;
+ case ZEND_POW:
+ zend_ast_evaluate(&op1, (&ast->u.child)[0], scope TSRMLS_CC);
+ zend_ast_evaluate(&op2, (&ast->u.child)[1], scope TSRMLS_CC);
+ pow_function(result, &op1, &op2 TSRMLS_CC);
+ zval_dtor(&op1);
+ zval_dtor(&op2);
+ break;
case ZEND_DIV:
zend_ast_evaluate(&op1, (&ast->u.child)[0], scope TSRMLS_CC);
zend_ast_evaluate(&op2, (&ast->u.child)[1], scope TSRMLS_CC);
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index d384454..b7467b7 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -1006,6 +1006,7 @@ static_operation:
static_scalar_value '+' static_scalar_value { $$.u.ast =
zend_ast_create_binary(ZEND_ADD, $1.u.ast, $3.u.ast); }
| static_scalar_value '-' static_scalar_value { $$.u.ast =
zend_ast_create_binary(ZEND_SUB, $1..u.ast, $3.u.ast); }
| static_scalar_value '*' static_scalar_value { $$.u.ast =
zend_ast_create_binary(ZEND_MUL, $1.u.ast, $3.u.ast); }
+ | static_scalar_value T_POW static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_POW,
$1.u.ast, $3.u.ast); }
| static_scalar_value '/' static_scalar_value { $$.u.ast =
zend_ast_create_binary(ZEND_DIV, $1.u.ast, $3.u.ast); }
| static_scalar_value '%' static_scalar_value { $$.u.ast =
zend_ast_create_binary(ZEND_MOD, $1.u.ast, $3.u.ast); }
| '!' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, $2.u.ast); }