]> granicus.if.org Git - php/commitdiff
Allow T_POW in constant expressions
authorTjerk Meesters <datibbaw@php.net>
Thu, 6 Mar 2014 00:31:01 +0000 (08:31 +0800)
committerTjerk Meesters <datibbaw@php.net>
Fri, 7 Mar 2014 01:14:27 +0000 (09:14 +0800)
Zend/tests/constant_expressions.phpt
Zend/zend_ast.c
Zend/zend_language_parser.y

index 7dea0d83f740313068ff8ca382b12a2910661d6f..cf6474bd63527ca310531d14a92e9d0822111c62 100644 (file)
@@ -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)
index cf595b4d58b329c9285cde449c4dab5b253a4483..9a0808db9d8390a6af4a4a0bb7ebac3178ed9947 100644 (file)
@@ -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);
index d3844540cf597a86802e19966bb579ae15c26e53..b7467b755274c2270af52868967cdf9196e2a1f4 100644 (file)
@@ -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); }