From: Tjerk Meesters Date: Thu, 6 Mar 2014 00:31:01 +0000 (+0800) Subject: Allow T_POW in constant expressions X-Git-Tag: php-5.6.0beta1~3^2~129^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3d1fa4cb17038e530561a7a20c1b9497cec68f92;p=php Allow T_POW in constant expressions --- diff --git a/Zend/tests/constant_expressions.phpt b/Zend/tests/constant_expressions.phpt index 7dea0d83f7..cf6474bd63 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 cf595b4d58..9a0808db9d 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 d3844540cf..b7467b7552 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); }