@@ -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 ) {
@@ -1424,6 +1430,12 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1424
1430
SKIP_IF_TOP (op1 );
1425
1431
SKIP_IF_TOP (op2 );
1426
1432
1433
+ /* TODO: We could implement support for evaluation of + on partial arrays. */
1434
+ if (IS_PARTIAL_ARRAY (op1 ) || IS_PARTIAL_ARRAY (op2 )) {
1435
+ SET_RESULT_BOT (result );
1436
+ break ;
1437
+ }
1438
+
1427
1439
if (zend_optimizer_eval_binary_op (& zv , opline -> opcode , op1 , op2 ) == SUCCESS ) {
1428
1440
SET_RESULT (result , & zv );
1429
1441
zval_ptr_dtor_nogc (& zv );
@@ -1610,6 +1622,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1610
1622
case ZEND_BW_NOT :
1611
1623
case ZEND_BOOL_NOT :
1612
1624
SKIP_IF_TOP (op1 );
1625
+ if (IS_PARTIAL_ARRAY (op1 )) {
1626
+ SET_RESULT_BOT (result );
1627
+ break ;
1628
+ }
1613
1629
if (zend_optimizer_eval_unary_op (& zv , opline -> opcode , op1 ) == SUCCESS ) {
1614
1630
SET_RESULT (result , & zv );
1615
1631
zval_ptr_dtor_nogc (& zv );
@@ -1619,6 +1635,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1619
1635
break ;
1620
1636
case ZEND_CAST :
1621
1637
SKIP_IF_TOP (op1 );
1638
+ if (IS_PARTIAL_ARRAY (op1 )) {
1639
+ SET_RESULT_BOT (result );
1640
+ break ;
1641
+ }
1622
1642
if (zend_optimizer_eval_cast (& zv , opline -> extended_value , op1 ) == SUCCESS ) {
1623
1643
SET_RESULT (result , & zv );
1624
1644
zval_ptr_dtor_nogc (& zv );
@@ -1630,6 +1650,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1630
1650
case ZEND_JMPZ_EX :
1631
1651
case ZEND_JMPNZ_EX :
1632
1652
SKIP_IF_TOP (op1 );
1653
+ if (IS_PARTIAL_ARRAY (op1 )) {
1654
+ SET_RESULT_BOT (result );
1655
+ break ;
1656
+ }
1633
1657
ZVAL_BOOL (& zv , zend_is_true (op1 ));
1634
1658
SET_RESULT (result , & zv );
1635
1659
break ;
@@ -1760,6 +1784,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1760
1784
break ;
1761
1785
case ZEND_ROPE_INIT :
1762
1786
SKIP_IF_TOP (op2 );
1787
+ if (IS_PARTIAL_ARRAY (op2 )) {
1788
+ SET_RESULT_BOT (result );
1789
+ break ;
1790
+ }
1763
1791
if (zend_optimizer_eval_cast (& zv , IS_STRING , op2 ) == SUCCESS ) {
1764
1792
SET_RESULT (result , & zv );
1765
1793
zval_ptr_dtor_nogc (& zv );
@@ -1774,6 +1802,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1774
1802
// string for all SSA vars with some extra checks
1775
1803
SKIP_IF_TOP (op1 );
1776
1804
SKIP_IF_TOP (op2 );
1805
+ if (IS_PARTIAL_ARRAY (op2 )) {
1806
+ SET_RESULT_BOT (result );
1807
+ break ;
1808
+ }
1777
1809
if (zend_optimizer_eval_binary_op (& zv , ZEND_CONCAT , op1 , op2 ) == SUCCESS ) {
1778
1810
SET_RESULT (result , & zv );
1779
1811
zval_ptr_dtor_nogc (& zv );
0 commit comments