From: Nikita Popov Date: Thu, 26 Jun 2014 11:00:13 +0000 (+0200) Subject: Bring static scalar AST more in line with normal AST X-Git-Tag: POST_AST_MERGE^2~188 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0237954778de1e235b6b7296068647431134f976;p=php Bring static scalar AST more in line with normal AST --- diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 8256eca8e4..ee8dd662c1 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -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]) { diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 580ce9c24c..78bf68cfe6 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -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, diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index cb54ae2db3..8564ad9919 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -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; } ;