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);
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);
}
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:
}
}
+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;
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;
| 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
| 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; }
;