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);
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);
}
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);
}
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]) {
;
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; }
;