@@ -1553,6 +1553,35 @@ ZEND_API zend_result zend_unmangle_property_name_ex(const zend_string *name, con
15531553}
15541554/* }}} */
15551555
1556+ static bool array_is_const_ex (zend_array * array , uint32_t * max_checks )
1557+ {
1558+ if (zend_hash_num_elements (array ) > * max_checks ) {
1559+ return false;
1560+ }
1561+ * max_checks -= zend_hash_num_elements (array );
1562+
1563+ zval * element ;
1564+ ZEND_HASH_FOREACH_VAL (array , element ) {
1565+ if (Z_TYPE_P (element ) < IS_ARRAY ) {
1566+ continue ;
1567+ } else if (Z_TYPE_P (element ) == IS_ARRAY ) {
1568+ if (!array_is_const_ex (array , max_checks )) {
1569+ return false;
1570+ }
1571+ } else if (UNEXPECTED (Z_TYPE_P (element ) >=IS_OBJECT )) {
1572+ return false;
1573+ }
1574+ } ZEND_HASH_FOREACH_END ();
1575+
1576+ return true;
1577+ }
1578+
1579+ static bool array_is_const (zend_array * array )
1580+ {
1581+ uint32_t max_checks = 50 ;
1582+ return array_is_const_ex (array , & max_checks );
1583+ }
1584+
15561585static bool can_ct_eval_const (zend_constant * c ) {
15571586 if (ZEND_CONSTANT_FLAGS (c ) & CONST_DEPRECATED ) {
15581587 return 0 ;
@@ -1563,9 +1592,13 @@ static bool can_ct_eval_const(zend_constant *c) {
15631592 && (CG (compiler_options ) & ZEND_COMPILE_WITH_FILE_CACHE ))) {
15641593 return 1 ;
15651594 }
1566- if (Z_TYPE (c -> value ) < IS_OBJECT
1595+ if (Z_TYPE (c -> value ) < IS_ARRAY
15671596 && !(CG (compiler_options ) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION )) {
15681597 return 1 ;
1598+ } else if (Z_TYPE (c -> value ) == IS_ARRAY
1599+ && !(CG (compiler_options ) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION )
1600+ && array_is_const (Z_ARR (c -> value ))) {
1601+ return 1 ;
15691602 }
15701603 return 0 ;
15711604}
@@ -1792,7 +1825,10 @@ static bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name, zend
17921825 c = & cc -> value ;
17931826
17941827 /* Substitute case-sensitive (or lowercase) persistent class constants */
1795- if (Z_TYPE_P (c ) < IS_OBJECT ) {
1828+ if (Z_TYPE_P (c ) < IS_ARRAY ) {
1829+ ZVAL_COPY_OR_DUP (zv , c );
1830+ return 1 ;
1831+ } else if (Z_TYPE_P (c ) == IS_ARRAY && array_is_const (Z_ARR_P (c ))) {
17961832 ZVAL_COPY_OR_DUP (zv , c );
17971833 return 1 ;
17981834 }
0 commit comments