@@ -1611,22 +1611,32 @@ zend_class_entry *zend_fetch_class_by_name(const char *class_name, uint class_na
1611
1611
ai.afn[idx] ? ZEND_FN_SCOPE_NAME(ai.afn[idx]) : "", \
1612
1612
ai.afn[idx] ? "::" : "", \
1613
1613
ai.afn[idx] ? ai.afn[idx]->common.function_name : "", \
1614
- ai.afn[idx] && ai.afn[idx + 1] ? ", " : (ai.afn[idx] && ai.afn_cnt > MAX_ABSTRACT_INFO_CNT ? ", ..." : "")
1614
+ ai.afn[idx] && ai.afn[idx + 1] ? ", " : (ai.afn[idx] && ai.cnt > MAX_ABSTRACT_INFO_CNT ? ", ..." : "")
1615
1615
1616
1616
typedef struct _zend_abstract_info {
1617
1617
zend_function * afn [MAX_ABSTRACT_INFO_CNT + 1 ];
1618
- int afn_cnt ;
1618
+ int cnt ;
1619
1619
int ctor ;
1620
1620
} zend_abstract_info ;
1621
1621
1622
- static void zend_verify_abstract_class_accessor (zend_function * fn , zend_abstract_info * ai ) /* {{{ */
1622
+ static int zend_verify_abstract_class_function (zend_function * fn , zend_abstract_info * ai TSRMLS_DC ) /* {{{ */
1623
1623
{
1624
- if (fn && (fn -> common .fn_flags & ZEND_ACC_ABSTRACT )) {
1625
- if (ai -> afn_cnt < MAX_ABSTRACT_INFO_CNT ) {
1626
- ai -> afn [ai -> afn_cnt ] = fn ;
1624
+ if (fn -> common .fn_flags & ZEND_ACC_ABSTRACT ) {
1625
+ if (ai -> cnt < MAX_ABSTRACT_INFO_CNT ) {
1626
+ ai -> afn [ai -> cnt ] = fn ;
1627
+ }
1628
+ if (fn -> common .fn_flags & ZEND_ACC_CTOR ) {
1629
+ if (!ai -> ctor ) {
1630
+ ai -> cnt ++ ;
1631
+ ai -> ctor = 1 ;
1632
+ } else {
1633
+ ai -> afn [ai -> cnt ] = NULL ;
1634
+ }
1635
+ } else {
1636
+ ai -> cnt ++ ;
1627
1637
}
1628
- ai -> afn_cnt ++ ;
1629
1638
}
1639
+ return 0 ;
1630
1640
}
1631
1641
/* }}} */
1632
1642
@@ -1635,28 +1645,9 @@ static int zend_verify_abstract_class_property(zend_property_info *prop, zend_ab
1635
1645
if (prop -> ai ) {
1636
1646
int i ;
1637
1647
for (i = 0 ; i < ZEND_ACCESSOR_COUNT ; ++ i ) {
1638
- zend_verify_abstract_class_accessor (prop -> ai -> fn [i ], ai );
1639
- }
1640
- }
1641
- return 0 ;
1642
- }
1643
- /* }}} */
1644
-
1645
- static int zend_verify_abstract_class_function (zend_function * fn , zend_abstract_info * ai TSRMLS_DC ) /* {{{ */
1646
- {
1647
- if (fn -> common .fn_flags & ZEND_ACC_ABSTRACT ) {
1648
- if (ai -> afn_cnt < MAX_ABSTRACT_INFO_CNT ) {
1649
- ai -> afn [ai -> afn_cnt ] = fn ;
1650
- }
1651
- if (fn -> common .fn_flags & ZEND_ACC_CTOR ) {
1652
- if (!ai -> ctor ) {
1653
- ai -> afn_cnt ++ ;
1654
- ai -> ctor = 1 ;
1655
- } else {
1656
- ai -> afn [ai -> afn_cnt ] = NULL ;
1648
+ if (prop -> ai -> fn [i ]) {
1649
+ zend_verify_abstract_class_function (prop -> ai -> fn [i ], ai TSRMLS_CC );
1657
1650
}
1658
- } else {
1659
- ai -> afn_cnt ++ ;
1660
1651
}
1661
1652
}
1662
1653
return 0 ;
@@ -1671,10 +1662,10 @@ void zend_verify_abstract_class(zend_class_entry *ce TSRMLS_DC) /* {{{ */
1671
1662
memset (& ai , 0 , sizeof (ai ));
1672
1663
zend_hash_apply_with_argument (& ce -> function_table , (apply_func_arg_t ) zend_verify_abstract_class_function , & ai TSRMLS_CC );
1673
1664
1674
- if (ai .afn_cnt ) {
1665
+ if (ai .cnt ) {
1675
1666
zend_error (E_ERROR , "Class %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")" ,
1676
- ce -> name , ai .afn_cnt ,
1677
- ai .afn_cnt > 1 ? "s" : "" ,
1667
+ ce -> name , ai .cnt ,
1668
+ ai .cnt > 1 ? "s" : "" ,
1678
1669
DISPLAY_ABSTRACT_FN (0 ),
1679
1670
DISPLAY_ABSTRACT_FN (1 ),
1680
1671
DISPLAY_ABSTRACT_FN (2 )
@@ -1684,10 +1675,10 @@ void zend_verify_abstract_class(zend_class_entry *ce TSRMLS_DC) /* {{{ */
1684
1675
memset (& ai , 0 , sizeof (ai ));
1685
1676
zend_hash_apply_with_argument (& ce -> properties_info , (apply_func_arg_t ) zend_verify_abstract_class_property , & ai TSRMLS_CC );
1686
1677
1687
- if (ai .afn_cnt ) {
1678
+ if (ai .cnt ) {
1688
1679
zend_error (E_ERROR , "Class %s contains %d abstract accessor%s and must be declared abstract or implement the remaining accessors (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")" ,
1689
- ce -> name , ai .afn_cnt ,
1690
- ai .afn_cnt > 1 ? "s" : "" ,
1680
+ ce -> name , ai .cnt ,
1681
+ ai .cnt > 1 ? "s" : "" ,
1691
1682
DISPLAY_ABSTRACT_FN (0 ),
1692
1683
DISPLAY_ABSTRACT_FN (1 ),
1693
1684
DISPLAY_ABSTRACT_FN (2 )
0 commit comments