]> granicus.if.org Git - php/commitdiff
Bring static scalar AST more in line with normal AST
authorNikita Popov <nikic@php.net>
Thu, 26 Jun 2014 11:00:13 +0000 (13:00 +0200)
committerNikita Popov <nikic@php.net>
Thu, 26 Jun 2014 11:06:39 +0000 (13:06 +0200)
Zend/zend_ast.c
Zend/zend_ast.h
Zend/zend_language_parser.y

index 8256eca8e41a34b69511c0a1cec52ef84c4bf530..ee8dd662c1bfd18e2a8cf17b7bdc8dd6bb2b1e6a 100644 (file)
@@ -168,90 +168,16 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
        zval op1, op2;
 
        switch (ast->kind) {
-               case ZEND_ADD:
+               case ZEND_AST_BINARY_OP:
+               {
+                       binary_op_type op = get_binary_op(ast->attr);
                        zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
                        zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       add_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_SUB:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       sub_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_MUL:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       mul_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_POW:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->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->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       div_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_MOD:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       mod_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_SL:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       shift_left_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_SR:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       shift_right_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_CONCAT:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       concat_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_BW_OR:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       bitwise_or_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_BW_AND:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       bitwise_and_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_BW_XOR:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       bitwise_xor_function(result, &op1, &op2 TSRMLS_CC);
+                       op(result, &op1, &op2 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);
@@ -262,62 +188,13 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
                        boolean_not_function(result, &op1 TSRMLS_CC);
                        zval_dtor(&op1);
                        break;
-               case ZEND_BOOL_XOR:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       boolean_xor_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_IS_IDENTICAL:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       is_identical_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_IS_NOT_IDENTICAL:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       is_not_identical_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_IS_EQUAL:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       is_equal_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_IS_NOT_EQUAL:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       is_not_equal_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_IS_SMALLER:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       is_smaller_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
-               case ZEND_IS_SMALLER_OR_EQUAL:
-                       zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
-                       zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
-                       is_smaller_or_equal_function(result, &op1, &op2 TSRMLS_CC);
-                       zval_dtor(&op1);
-                       zval_dtor(&op2);
-                       break;
                case ZEND_CONST:
                        ZVAL_DUP(result, zend_ast_get_zval(ast));
                        if (Z_OPT_CONSTANT_P(result)) {
                                zval_update_constant_ex(result, 1, scope TSRMLS_CC);
                        }
                        break;
-               case ZEND_BOOL_AND:
+               case ZEND_AST_AND:
                        zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
                        if (zend_is_true(&op1 TSRMLS_CC)) {
                                zend_ast_evaluate(&op2, ast->child[1], scope TSRMLS_CC);
@@ -328,7 +205,7 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
                        }
                        zval_dtor(&op1);
                        break;
-               case ZEND_BOOL_OR:
+               case ZEND_AST_OR:
                        zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
                        if (zend_is_true(&op1 TSRMLS_CC)) {
                                ZVAL_BOOL(result, 1);
@@ -339,7 +216,7 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
                        }
                        zval_dtor(&op1);
                        break;
-               case ZEND_SELECT:
+               case ZEND_AST_CONDITIONAL:
                        zend_ast_evaluate(&op1, ast->child[0], scope TSRMLS_CC);
                        if (zend_is_true(&op1 TSRMLS_CC)) {
                                if (!ast->child[1]) {
index 580ce9c24cee38392b3ddc437a3b986d32ae1c33..78bf68cfe66fa61d1eddb80b419e8ade1bf1e032 100644 (file)
@@ -27,9 +27,6 @@
 enum _zend_ast_kind {
        /* first 256 kinds are reserved for opcodes */
        ZEND_CONST = 256, /* TODO.AST: Split in constant lookup and literal zval */
-       ZEND_BOOL_AND,
-       ZEND_BOOL_OR,
-       ZEND_SELECT,
 
        ZEND_AST_ZNODE,
 
index cb54ae2db31fc4e0335b8738d689f83c571049c9..8564ad99197593f21dfb75895ca29f560d924a41 100644 (file)
@@ -999,38 +999,68 @@ static_scalar_value:
 ;
 
 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); }
+               '!' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, $2.u.ast); }
        |       '~' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BW_NOT, $2.u.ast); }
-       |       static_scalar_value '|' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BW_OR, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value '&' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BW_AND, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value '^' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BW_XOR, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_SL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_SL, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_SR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_SR, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value '.' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_CONCAT, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_LOGICAL_XOR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_LOGICAL_AND static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_LOGICAL_OR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_BOOLEAN_AND static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_BOOLEAN_OR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_IS_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_IDENTICAL, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_NOT_IDENTICAL, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_IS_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_EQUAL, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value T_IS_NOT_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_NOT_EQUAL, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value '<' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, $1.u.ast, $3.u.ast); }
-       |       static_scalar_value '>' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, $3.u.ast, $1.u.ast); }
-       |       static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, $1.u.ast, $3.u.ast); }
-       |       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_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; }
+       |       static_scalar_value '+' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_ADD, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '-' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_SUB, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '*' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_MUL, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_POW static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_POW, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '/' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_DIV, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '%' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_MOD, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '|' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_OR, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '&' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_AND, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '^' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_XOR, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_SL static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_SL, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_SR static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_SR, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '.' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_CONCAT, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_LOGICAL_XOR static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_IS_IDENTICAL static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_IDENTICAL, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_NOT_IDENTICAL, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_IS_EQUAL static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_EQUAL, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_IS_NOT_EQUAL static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_NOT_EQUAL, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '<' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '>' static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER, $3.u.ast, $1.u.ast); }
+       |       static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER_OR_EQUAL, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER_OR_EQUAL, $3.u.ast, $1.u.ast); }
+       |       static_scalar_value T_LOGICAL_AND static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary(ZEND_AST_AND, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_LOGICAL_OR static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary(ZEND_AST_OR, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_BOOLEAN_AND static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary(ZEND_AST_AND, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value T_BOOLEAN_OR static_scalar_value
+                       { $$.u.ast = zend_ast_create_binary(ZEND_AST_OR, $1.u.ast, $3.u.ast); }
+       |       static_scalar_value '?' ':' static_scalar_value
+                       { $$.u.ast = zend_ast_create_ternary(ZEND_AST_CONDITIONAL, $1.u.ast, NULL, $4.u.ast); }
+       |       static_scalar_value '?' static_scalar_value ':' static_scalar_value
+                       { $$.u.ast = zend_ast_create_ternary(
+                             ZEND_AST_CONDITIONAL, $1.u.ast, $3.u.ast, $5.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 ')' { $$.u.ast = $2.u.ast; }
 ;