From dd60c8e0f1a8918f08b4733570476e5b08ffaed5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 26 Jun 2014 22:02:54 +0200 Subject: [PATCH] Reuse expr for static_scalar --- Zend/zend_ast.c | 13 +++++++++++++ Zend/zend_compile.c | 1 + Zend/zend_language_parser.y | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index ec3e9dbc84..c84842eeb1 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -178,6 +178,19 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s zval_dtor(&op2); break; } + case ZEND_AST_GREATER: + case ZEND_AST_GREATER_EQUAL: + { + /* op1 > op2 is the same as op2 < op1 */ + binary_op_type op = ast->kind == ZEND_AST_GREATER + ? is_smaller_function : is_smaller_or_equal_function; + zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC); + zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC); + op(result, &op2, &op1 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + } case ZEND_BW_NOT: zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC); bitwise_not_function(result, &op1 TSRMLS_CC); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1c5c951a4b..ef02d31a5f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7790,6 +7790,7 @@ void zend_compile_encaps_list(znode *result, zend_ast *ast TSRMLS_DC) { zend_bool zend_is_allowed_in_const_expr(zend_ast_kind kind) { return kind == ZEND_CONST || kind == ZEND_AST_BINARY_OP + || kind == ZEND_AST_GREATER || kind == ZEND_AST_GREATER_EQUAL || kind == ZEND_AST_AND || kind == ZEND_AST_OR || kind == ZEND_BW_NOT || kind == ZEND_BOOL_NOT || kind == ZEND_AST_UNARY_PLUS || kind == ZEND_AST_UNARY_MINUS diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 3dbb27675c..945a900213 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -799,7 +799,7 @@ expr_without_variable: | expr T_LOGICAL_AND expr { $$.u.ast = zend_ast_create_binary(ZEND_AST_AND, $1.u.ast, $3.u.ast); } | expr T_LOGICAL_XOR expr - { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); } + { $$.u.ast = zend_ast_create_binary_op(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); } | expr '|' expr { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_OR, $1.u.ast, $3.u.ast); } | expr '&' expr { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_AND, $1.u.ast, $3.u.ast); } | expr '^' expr { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_XOR, $1.u.ast, $3.u.ast); } @@ -973,7 +973,7 @@ common_scalar: ; static_scalar: /* compile-time evaluated scalars */ - static_scalar_value { zend_do_constant_expression(&$$, $1.u.ast TSRMLS_CC); } + expr { zend_do_constant_expression(&$$, $1.u.ast TSRMLS_CC); } ; static_scalar_value: -- 2.50.1