* Same as simple_math, but result is always bool */
| 1581 | * Same as simple_math, but result is always bool |
| 1582 | */ |
| 1583 | void php_eval_compare(PHP_EXP_OP op, PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result) |
| 1584 | { |
| 1585 | result->type = PHP_VAL_BOOL; |
| 1586 | if ( (op1->type == PHP_VAL_STRING) || (op2->type == PHP_VAL_STRING) ) { |
| 1587 | cast_value_str(op1); |
| 1588 | cast_value_str(op2); |
| 1589 | int cmp_val = strcmp(op1->str_val, op2->str_val); |
| 1590 | switch(op) { |
| 1591 | case PHP_OP_EQ: |
| 1592 | result->int_val = (cmp_val == 0); |
| 1593 | break; |
| 1594 | case PHP_OP_NEQ: |
| 1595 | result->int_val = (cmp_val != 0); |
| 1596 | break; |
| 1597 | case PHP_OP_GRT: |
| 1598 | result->int_val = (cmp_val > 0); |
| 1599 | break; |
| 1600 | case PHP_OP_LWR: |
| 1601 | result->int_val = (cmp_val < 0); |
| 1602 | break; |
| 1603 | case PHP_OP_GRT_EQ: |
| 1604 | result->int_val = (cmp_val >= 0); |
| 1605 | break; |
| 1606 | case PHP_OP_LWR_EQ: |
| 1607 | result->int_val = (cmp_val <= 0); |
| 1608 | break; |
| 1609 | default: |
| 1610 | php_report_error(PHP_INTERNAL_ERROR, "This op is not compare op"); |
| 1611 | } |
| 1612 | } else { |
| 1613 | PHP_VALUE_TYPE restype = cast_type_resolve(op1, op2); |
| 1614 | switch(op) { |
| 1615 | case PHP_OP_EQ: |
| 1616 | if ( restype == PHP_VAL_FLOAT ) { |
| 1617 | result->int_val = op1->float_val == op2->float_val; |
| 1618 | } else { |
| 1619 | result->int_val = op1->int_val == op2->int_val; |
| 1620 | } |
| 1621 | break; |
| 1622 | case PHP_OP_NEQ: |
| 1623 | if ( restype == PHP_VAL_FLOAT ) { |
| 1624 | result->int_val = op1->float_val != op2->float_val; |
| 1625 | } else { |
| 1626 | result->int_val = op1->int_val != op2->int_val; |
| 1627 | } |
| 1628 | break; |
| 1629 | case PHP_OP_GRT: |
| 1630 | if ( restype == PHP_VAL_FLOAT ) { |
| 1631 | result->int_val = op1->float_val > op2->float_val; |
| 1632 | } else { |
| 1633 | result->int_val = op1->int_val > op2->int_val; |
| 1634 | } |
| 1635 | break; |
| 1636 | case PHP_OP_GRT_EQ: |
| 1637 | if ( restype == PHP_VAL_FLOAT ) { |
| 1638 | result->int_val = op1->float_val >= op2->float_val; |
| 1639 | } else { |
| 1640 | result->int_val = op1->int_val >= op2->int_val; |
no test coverage detected