@@ -680,7 +680,13 @@ static inline int ct_eval_isset_isempty(zval *result, uint32_t extended_value, z
680
680
}
681
681
682
682
static inline void ct_eval_type_check (zval * result , uint32_t type_mask , zval * op1 ) {
683
- ZVAL_BOOL (result , (type_mask >> Z_TYPE_P (op1 )) & 1 );
683
+ uint32_t type = Z_TYPE_P (op1 );
684
+ if (type == PARTIAL_ARRAY ) {
685
+ type = IS_ARRAY ;
686
+ } else if (type == PARTIAL_OBJECT ) {
687
+ type = IS_OBJECT ;
688
+ }
689
+ ZVAL_BOOL (result , (type_mask >> type ) & 1 );
684
690
}
685
691
686
692
static inline int ct_eval_in_array (zval * result , uint32_t extended_value , zval * op1 , zval * op2 ) {
@@ -1421,6 +1427,12 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1421
1427
SKIP_IF_TOP (op1 );
1422
1428
SKIP_IF_TOP (op2 );
1423
1429
1430
+ /* TODO: We could implement support for evaluation of + on partial arrays. */
1431
+ if (IS_PARTIAL_ARRAY (op1 ) || IS_PARTIAL_ARRAY (op2 )) {
1432
+ SET_RESULT_BOT (result );
1433
+ break ;
1434
+ }
1435
+
1424
1436
if (zend_optimizer_eval_binary_op (& zv , opline -> opcode , op1 , op2 ) == SUCCESS ) {
1425
1437
SET_RESULT (result , & zv );
1426
1438
zval_ptr_dtor_nogc (& zv );
@@ -1607,6 +1619,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1607
1619
case ZEND_BW_NOT :
1608
1620
case ZEND_BOOL_NOT :
1609
1621
SKIP_IF_TOP (op1 );
1622
+ if (IS_PARTIAL_ARRAY (op1 )) {
1623
+ SET_RESULT_BOT (result );
1624
+ break ;
1625
+ }
1610
1626
if (zend_optimizer_eval_unary_op (& zv , opline -> opcode , op1 ) == SUCCESS ) {
1611
1627
SET_RESULT (result , & zv );
1612
1628
zval_ptr_dtor_nogc (& zv );
@@ -1616,6 +1632,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1616
1632
break ;
1617
1633
case ZEND_CAST :
1618
1634
SKIP_IF_TOP (op1 );
1635
+ if (IS_PARTIAL_ARRAY (op1 )) {
1636
+ SET_RESULT_BOT (result );
1637
+ break ;
1638
+ }
1619
1639
if (zend_optimizer_eval_cast (& zv , opline -> extended_value , op1 ) == SUCCESS ) {
1620
1640
SET_RESULT (result , & zv );
1621
1641
zval_ptr_dtor_nogc (& zv );
@@ -1627,6 +1647,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1627
1647
case ZEND_JMPZ_EX :
1628
1648
case ZEND_JMPNZ_EX :
1629
1649
SKIP_IF_TOP (op1 );
1650
+ if (IS_PARTIAL_ARRAY (op1 )) {
1651
+ SET_RESULT_BOT (result );
1652
+ break ;
1653
+ }
1630
1654
ZVAL_BOOL (& zv , zend_is_true (op1 ));
1631
1655
SET_RESULT (result , & zv );
1632
1656
break ;
@@ -1757,6 +1781,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1757
1781
break ;
1758
1782
case ZEND_ROPE_INIT :
1759
1783
SKIP_IF_TOP (op2 );
1784
+ if (IS_PARTIAL_ARRAY (op2 )) {
1785
+ SET_RESULT_BOT (result );
1786
+ break ;
1787
+ }
1760
1788
if (zend_optimizer_eval_cast (& zv , IS_STRING , op2 ) == SUCCESS ) {
1761
1789
SET_RESULT (result , & zv );
1762
1790
zval_ptr_dtor_nogc (& zv );
@@ -1771,6 +1799,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1771
1799
// string for all SSA vars with some extra checks
1772
1800
SKIP_IF_TOP (op1 );
1773
1801
SKIP_IF_TOP (op2 );
1802
+ if (IS_PARTIAL_ARRAY (op2 )) {
1803
+ SET_RESULT_BOT (result );
1804
+ break ;
1805
+ }
1774
1806
if (zend_optimizer_eval_binary_op (& zv , ZEND_CONCAT , op1 , op2 ) == SUCCESS ) {
1775
1807
SET_RESULT (result , & zv );
1776
1808
zval_ptr_dtor_nogc (& zv );
0 commit comments