@@ -660,7 +660,13 @@ static inline int ct_eval_isset_isempty(zval *result, uint32_t extended_value, z
660
660
}
661
661
662
662
static inline void ct_eval_type_check (zval * result , uint32_t type_mask , zval * op1 ) {
663
- ZVAL_BOOL (result , (type_mask >> Z_TYPE_P (op1 )) & 1 );
663
+ uint32_t type = Z_TYPE_P (op1 );
664
+ if (type == PARTIAL_ARRAY ) {
665
+ type = IS_ARRAY ;
666
+ } else if (type == PARTIAL_OBJECT ) {
667
+ type = IS_OBJECT ;
668
+ }
669
+ ZVAL_BOOL (result , (type_mask >> type ) & 1 );
664
670
}
665
671
666
672
static inline int ct_eval_in_array (zval * result , uint32_t extended_value , zval * op1 , zval * op2 ) {
@@ -1359,6 +1365,12 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1359
1365
SKIP_IF_TOP (op1 );
1360
1366
SKIP_IF_TOP (op2 );
1361
1367
1368
+ /* TODO: We could implement support for evaluation of + on partial arrays. */
1369
+ if (IS_PARTIAL_ARRAY (op1 ) || IS_PARTIAL_ARRAY (op2 )) {
1370
+ SET_RESULT_BOT (result );
1371
+ break ;
1372
+ }
1373
+
1362
1374
if (zend_optimizer_eval_binary_op (& zv , opline -> opcode , op1 , op2 ) == SUCCESS ) {
1363
1375
SET_RESULT (result , & zv );
1364
1376
zval_ptr_dtor_nogc (& zv );
@@ -1540,6 +1552,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1540
1552
case ZEND_BW_NOT :
1541
1553
case ZEND_BOOL_NOT :
1542
1554
SKIP_IF_TOP (op1 );
1555
+ if (IS_PARTIAL_ARRAY (op1 )) {
1556
+ SET_RESULT_BOT (result );
1557
+ break ;
1558
+ }
1543
1559
if (zend_optimizer_eval_unary_op (& zv , opline -> opcode , op1 ) == SUCCESS ) {
1544
1560
SET_RESULT (result , & zv );
1545
1561
zval_ptr_dtor_nogc (& zv );
@@ -1549,6 +1565,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1549
1565
break ;
1550
1566
case ZEND_CAST :
1551
1567
SKIP_IF_TOP (op1 );
1568
+ if (IS_PARTIAL_ARRAY (op1 )) {
1569
+ SET_RESULT_BOT (result );
1570
+ break ;
1571
+ }
1552
1572
if (zend_optimizer_eval_cast (& zv , opline -> extended_value , op1 ) == SUCCESS ) {
1553
1573
SET_RESULT (result , & zv );
1554
1574
zval_ptr_dtor_nogc (& zv );
@@ -1560,6 +1580,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1560
1580
case ZEND_JMPZ_EX :
1561
1581
case ZEND_JMPNZ_EX :
1562
1582
SKIP_IF_TOP (op1 );
1583
+ if (IS_PARTIAL_ARRAY (op1 )) {
1584
+ SET_RESULT_BOT (result );
1585
+ break ;
1586
+ }
1563
1587
ZVAL_BOOL (& zv , zend_is_true (op1 ));
1564
1588
SET_RESULT (result , & zv );
1565
1589
break ;
@@ -1679,6 +1703,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1679
1703
break ;
1680
1704
case ZEND_ROPE_INIT :
1681
1705
SKIP_IF_TOP (op2 );
1706
+ if (IS_PARTIAL_ARRAY (op2 )) {
1707
+ SET_RESULT_BOT (result );
1708
+ break ;
1709
+ }
1682
1710
if (zend_optimizer_eval_cast (& zv , IS_STRING , op2 ) == SUCCESS ) {
1683
1711
SET_RESULT (result , & zv );
1684
1712
zval_ptr_dtor_nogc (& zv );
@@ -1693,6 +1721,10 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1693
1721
// string for all SSA vars with some extra checks
1694
1722
SKIP_IF_TOP (op1 );
1695
1723
SKIP_IF_TOP (op2 );
1724
+ if (IS_PARTIAL_ARRAY (op2 )) {
1725
+ SET_RESULT_BOT (result );
1726
+ break ;
1727
+ }
1696
1728
if (zend_optimizer_eval_binary_op (& zv , ZEND_CONCAT , op1 , op2 ) == SUCCESS ) {
1697
1729
SET_RESULT (result , & zv );
1698
1730
zval_ptr_dtor_nogc (& zv );
0 commit comments