From 1b84b87e78d78089d83aad644b451ada5c2892e1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 26 Jun 2014 12:43:20 +0200 Subject: [PATCH] Const eval unary pm (as previously) --- Zend/zend_ast.c | 4 +-- Zend/zend_ast.h | 11 ++++---- Zend/zend_compile.c | 52 ++++++++++++++++++++++++++++++++++--- Zend/zend_language_parser.y | 8 +++--- 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index c6f5ca8ccc..8256eca8e4 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -353,13 +353,13 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s zval_dtor(&op1); } break; - case ZEND_UNARY_PLUS: + case ZEND_AST_UNARY_PLUS: ZVAL_LONG(&op1, 0); zend_ast_evaluate(&op2, ast->child[0], scope TSRMLS_CC); add_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op2); break; - case ZEND_UNARY_MINUS: + case ZEND_AST_UNARY_MINUS: ZVAL_LONG(&op1, 0); zend_ast_evaluate(&op2, ast->child[0], scope TSRMLS_CC); sub_function(result, &op1, &op2 TSRMLS_CC); diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 9806790841..580ce9c24c 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -30,8 +30,6 @@ enum _zend_ast_kind { ZEND_BOOL_AND, ZEND_BOOL_OR, ZEND_SELECT, - ZEND_UNARY_PLUS, - ZEND_UNARY_MINUS, ZEND_AST_ZNODE, @@ -54,14 +52,15 @@ enum _zend_ast_kind { ZEND_AST_UNPACK, ZEND_AST_ASSIGN_OP, - ZEND_AST_BINARY_OP, - - ZEND_AST_AND, - ZEND_AST_OR, + ZEND_AST_BINARY_OP, ZEND_AST_GREATER, ZEND_AST_GREATER_EQUAL, + ZEND_AST_AND, + ZEND_AST_OR, + ZEND_AST_UNARY_PLUS, + ZEND_AST_UNARY_MINUS, ZEND_AST_CAST, ZEND_AST_CONDITIONAL, diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 533341db6d..48c438d3da 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7223,14 +7223,14 @@ void zend_compile_unary_pm(znode *result, zend_ast *ast TSRMLS_DC) { zend_ast *expr_ast = ast->child[0]; znode zero_node, expr_node; - ZEND_ASSERT(ast->kind == ZEND_UNARY_PLUS || ast->kind == ZEND_UNARY_MINUS); + ZEND_ASSERT(ast->kind == ZEND_AST_UNARY_PLUS || ast->kind == ZEND_AST_UNARY_MINUS); zero_node.op_type = IS_CONST; ZVAL_LONG(&zero_node.u.constant, 0); zend_compile_expr(&expr_node, expr_ast TSRMLS_CC); - emit_op_tmp(result, ast->kind == ZEND_UNARY_PLUS ? ZEND_ADD : ZEND_SUB, + emit_op_tmp(result, ast->kind == ZEND_AST_UNARY_PLUS ? ZEND_ADD : ZEND_SUB, &zero_node, &expr_node TSRMLS_CC); } @@ -7843,8 +7843,8 @@ void zend_compile_expr(znode *result, zend_ast *ast TSRMLS_DC) { case ZEND_BW_NOT: zend_compile_unary_op(result, ast TSRMLS_CC); return; - case ZEND_UNARY_PLUS: - case ZEND_UNARY_MINUS: + case ZEND_AST_UNARY_PLUS: + case ZEND_AST_UNARY_MINUS: zend_compile_unary_pm(result, ast TSRMLS_CC); return; case ZEND_AST_AND: @@ -7964,6 +7964,42 @@ void zend_eval_const_binary_op(zend_ast **ast_ptr TSRMLS_DC) { } } +void zend_eval_const_unary_pm(zend_ast **ast_ptr TSRMLS_DC) { + zend_ast *ast = *ast_ptr; + zend_ast *expr_ast = ast->child[0]; + + ZEND_ASSERT(ast->kind == ZEND_AST_UNARY_PLUS || ast->kind == ZEND_AST_UNARY_MINUS); + + if (expr_ast->kind == ZEND_CONST) { + binary_op_type op = ast->kind == ZEND_AST_UNARY_PLUS + ? add_function : sub_function; + + zval left, result; + ZVAL_LONG(&left, 0); + op(&result, &left, zend_ast_get_zval(expr_ast) TSRMLS_CC); + zend_ast_destroy(ast); + *ast_ptr = zend_ast_create_constant(&result); + } +} + +void zend_eval_const_greater(zend_ast **ast_ptr TSRMLS_DC) { + zend_ast *ast = *ast_ptr; + zend_ast *left_ast = ast->child[0]; + zend_ast *right_ast = ast->child[1]; + + ZEND_ASSERT(ast->kind == ZEND_AST_GREATER || ast->kind == ZEND_AST_GREATER_EQUAL); + + if (left_ast->kind == ZEND_CONST && right_ast->kind == ZEND_CONST) { + binary_op_type op = ast->kind == ZEND_AST_GREATER + ? is_smaller_function : is_smaller_or_equal_function; + + zval result; + op(&result, zend_ast_get_zval(right_ast), zend_ast_get_zval(left_ast) TSRMLS_CC); + zend_ast_destroy(ast); + *ast_ptr = zend_ast_create_constant(&result); + } +} + void zend_eval_const_array(zend_ast **ast_ptr TSRMLS_DC) { zend_ast *ast = *ast_ptr; zend_uint i; @@ -8043,6 +8079,14 @@ void zend_eval_const_expr(zend_ast **ast_ptr TSRMLS_DC) { case ZEND_AST_BINARY_OP: zend_eval_const_binary_op(ast_ptr TSRMLS_CC); break; + case ZEND_AST_GREATER: + case ZEND_AST_GREATER_EQUAL: + zend_eval_const_greater(ast_ptr TSRMLS_CC); + break; + case ZEND_AST_UNARY_PLUS: + case ZEND_AST_UNARY_MINUS: + zend_eval_const_unary_pm(ast_ptr TSRMLS_CC); + break; case ZEND_AST_ARRAY: zend_eval_const_array(ast_ptr TSRMLS_CC); break; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 7190f384a9..cb54ae2db3 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -812,8 +812,8 @@ expr_without_variable: | expr '%' expr { $$.u.ast = zend_ast_create_binary_op(ZEND_MOD, $1.u.ast, $3.u.ast); } | expr T_SL expr { $$.u.ast = zend_ast_create_binary_op(ZEND_SL, $1.u.ast, $3.u.ast); } | expr T_SR expr { $$.u.ast = zend_ast_create_binary_op(ZEND_SR, $1.u.ast, $3.u.ast); } - | '+' expr %prec T_INC { $$.u.ast = zend_ast_create_unary(ZEND_UNARY_PLUS, $2.u.ast); } - | '-' expr %prec T_INC { $$.u.ast = zend_ast_create_unary(ZEND_UNARY_MINUS, $2.u.ast); } + | '+' expr %prec T_INC { $$.u.ast = zend_ast_create_unary(ZEND_AST_UNARY_PLUS, $2.u.ast); } + | '-' expr %prec T_INC { $$.u.ast = zend_ast_create_unary(ZEND_AST_UNARY_MINUS, $2.u.ast); } | '!' expr { $$.u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, $2.u.ast); } | '~' expr { $$.u.ast = zend_ast_create_unary(ZEND_BW_NOT, $2.u.ast); } | expr T_IS_IDENTICAL expr @@ -1028,8 +1028,8 @@ static_operation: | static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, $3.u.ast, $1.u.ast); } | static_scalar_value '?' ':' static_scalar_value { $$.u.ast = zend_ast_create_ternary(ZEND_SELECT, $1.u.ast, NULL, $4.u.ast); } | static_scalar_value '?' static_scalar_value ':' static_scalar_value { $$.u.ast = zend_ast_create_ternary(ZEND_SELECT, $1.u.ast, $3.u.ast, $5.u.ast); } - | '+' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_UNARY_PLUS, $2.u.ast); } - | '-' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_UNARY_MINUS, $2.u.ast); } + | '+' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_AST_UNARY_PLUS, $2.u.ast); } + | '-' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_AST_UNARY_MINUS, $2.u.ast); } | '(' static_scalar_value ')' { $$ = $2; } ; -- 2.50.1