]> granicus.if.org Git - php/commitdiff
Const eval unary pm (as previously)
authorNikita Popov <nikic@php.net>
Thu, 26 Jun 2014 10:43:20 +0000 (12:43 +0200)
committerNikita Popov <nikic@php.net>
Thu, 26 Jun 2014 10:43:20 +0000 (12:43 +0200)
Zend/zend_ast.c
Zend/zend_ast.h
Zend/zend_compile.c
Zend/zend_language_parser.y

index c6f5ca8ccccfcef67e976b8ed02e91a79c213c55..8256eca8e41a34b69511c0a1cec52ef84c4bf530 100644 (file)
@@ -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);
index 9806790841c5171856f85628a987c44c0faf3401..580ce9c24cee38392b3ddc437a3b986d32ae1c33 100644 (file)
@@ -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,
index 533341db6df1268d89d6718ea60b9dec8ac229b9..48c438d3da54116c7b8dd01e320bbfdf3410e669 100644 (file)
@@ -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;
index 7190f384a9c73eaf55ae9a06dd860de837629b5a..cb54ae2db31fc4e0335b8738d689f83c571049c9 100644 (file)
@@ -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; }
 ;