@@ -1344,14 +1344,34 @@ ZEND_API HashTable *zend_separate_class_constants_table(zend_class_entry *class_
1344
1344
return constants_table ;
1345
1345
}
1346
1346
1347
+ static zend_result update_property (zval * val , zend_property_info * prop_info ) {
1348
+ if (ZEND_TYPE_IS_SET (prop_info -> type )) {
1349
+ zval tmp ;
1350
+
1351
+ ZVAL_COPY (& tmp , val );
1352
+ if (UNEXPECTED (zval_update_constant_ex (& tmp , prop_info -> ce ) != SUCCESS )) {
1353
+ zval_ptr_dtor (& tmp );
1354
+ return FAILURE ;
1355
+ }
1356
+ /* property initializers must always be evaluated with strict types */ ;
1357
+ if (UNEXPECTED (!zend_verify_property_type (prop_info , & tmp , /* strict */ 1 ))) {
1358
+ zval_ptr_dtor (& tmp );
1359
+ return FAILURE ;
1360
+ }
1361
+ zval_ptr_dtor (val );
1362
+ ZVAL_COPY_VALUE (val , & tmp );
1363
+ return SUCCESS ;
1364
+ }
1365
+ return zval_update_constant_ex (val , prop_info -> ce );
1366
+ }
1367
+
1347
1368
ZEND_API zend_result zend_update_class_constants (zend_class_entry * class_type ) /* {{{ */
1348
1369
{
1349
1370
zend_class_mutable_data * mutable_data = NULL ;
1350
1371
zval * default_properties_table = NULL ;
1351
1372
zval * static_members_table = NULL ;
1352
1373
zend_class_constant * c ;
1353
1374
zval * val ;
1354
- zend_property_info * prop_info ;
1355
1375
uint32_t ce_flags ;
1356
1376
1357
1377
ce_flags = class_type -> ce_flags ;
@@ -1430,33 +1450,30 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
1430
1450
}
1431
1451
1432
1452
if (ce_flags & (ZEND_ACC_HAS_AST_PROPERTIES |ZEND_ACC_HAS_AST_STATICS )) {
1433
- ZEND_HASH_FOREACH_PTR (& class_type -> properties_info , prop_info ) {
1434
- if (prop_info -> flags & ZEND_ACC_STATIC ) {
1435
- val = static_members_table + prop_info -> offset ;
1436
- } else {
1437
- val = (zval * )((char * )default_properties_table + prop_info -> offset - OBJ_PROP_TO_OFFSET (0 ));
1453
+ zend_property_info * prop_info ;
1454
+
1455
+ /* Use the default properties table to also update initializers of private properties
1456
+ * that have been shadowed in a child class. */
1457
+ for (uint32_t i = 0 ; i < class_type -> default_properties_count ; i ++ ) {
1458
+ val = & default_properties_table [i ];
1459
+ prop_info = class_type -> properties_info_table [i ];
1460
+ if (Z_TYPE_P (val ) == IS_CONSTANT_AST
1461
+ && UNEXPECTED (update_property (val , prop_info ) != SUCCESS )) {
1462
+ return FAILURE ;
1438
1463
}
1439
- if (Z_TYPE_P (val ) == IS_CONSTANT_AST ) {
1440
- if (ZEND_TYPE_IS_SET (prop_info -> type )) {
1441
- zval tmp ;
1464
+ }
1442
1465
1443
- ZVAL_COPY (& tmp , val );
1444
- if (UNEXPECTED (zval_update_constant_ex (& tmp , prop_info -> ce ) != SUCCESS )) {
1445
- zval_ptr_dtor (& tmp );
1446
- return FAILURE ;
1447
- }
1448
- /* property initializers must always be evaluated with strict types */ ;
1449
- if (UNEXPECTED (!zend_verify_property_type (prop_info , & tmp , /* strict */ 1 ))) {
1450
- zval_ptr_dtor (& tmp );
1466
+ if (class_type -> default_static_members_count ) {
1467
+ ZEND_HASH_FOREACH_PTR (& class_type -> properties_info , prop_info ) {
1468
+ if (prop_info -> flags & ZEND_ACC_STATIC ) {
1469
+ val = static_members_table + prop_info -> offset ;
1470
+ if (Z_TYPE_P (val ) == IS_CONSTANT_AST
1471
+ && UNEXPECTED (update_property (val , prop_info ) != SUCCESS )) {
1451
1472
return FAILURE ;
1452
1473
}
1453
- zval_ptr_dtor (val );
1454
- ZVAL_COPY_VALUE (val , & tmp );
1455
- } else if (UNEXPECTED (zval_update_constant_ex (val , prop_info -> ce ) != SUCCESS )) {
1456
- return FAILURE ;
1457
1474
}
1458
- }
1459
- } ZEND_HASH_FOREACH_END ();
1475
+ } ZEND_HASH_FOREACH_END ();
1476
+ }
1460
1477
}
1461
1478
1462
1479
ce_flags |= ZEND_ACC_CONSTANTS_UPDATED ;
0 commit comments