]> granicus.if.org Git - php/commitdiff
Avoid unnecesury iterations over parent classes, in case of no overriden private...
authorDmitry Stogov <dmitry@zend.com>
Wed, 12 Sep 2018 20:47:52 +0000 (23:47 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 12 Sep 2018 20:47:52 +0000 (23:47 +0300)
Zend/zend_object_handlers.c

index d36ed968f9f8dcc64e5f5b09fe7180b617915b29..8d0756eb3020f18769d673b7e0c193a9b335631b 100644 (file)
@@ -63,13 +63,14 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
        if (!zobj->properties) {
                zend_property_info *prop_info;
                zend_class_entry *ce = zobj->ce;
+               uint32_t flags = 0;
 
                zobj->properties = zend_new_array(ce->default_properties_count);
                if (ce->default_properties_count) {
                        zend_hash_real_init_mixed(zobj->properties);
                        ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
-                               if (/*prop_info->ce == ce &&*/
-                                   (prop_info->flags & ZEND_ACC_STATIC) == 0) {
+                               if (!(prop_info->flags & ZEND_ACC_STATIC)) {
+                                       flags |= prop_info->flags;
 
                                        if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
                                                HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
@@ -79,22 +80,24 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
                                                OBJ_PROP(zobj, prop_info->offset));
                                }
                        } ZEND_HASH_FOREACH_END();
-                       while (ce->parent && ce->parent->default_properties_count) {
-                               ce = ce->parent;
-                               ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
-                                       if (prop_info->ce == ce &&
-                                           (prop_info->flags & ZEND_ACC_STATIC) == 0 &&
-                                           (prop_info->flags & ZEND_ACC_PRIVATE) != 0) {
-                                               zval zv;
-
-                                               if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
-                                                       HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
+                       if (flags & ZEND_ACC_CHANGED) {
+                               while (ce->parent && ce->parent->default_properties_count) {
+                                       ce = ce->parent;
+                                       ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
+                                               if (prop_info->ce == ce &&
+                                                   !(prop_info->flags & ZEND_ACC_STATIC) &&
+                                                   (prop_info->flags & ZEND_ACC_PRIVATE)) {
+                                                       zval zv;
+
+                                                       if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
+                                                               HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
+                                                       }
+
+                                                       ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset));
+                                                       zend_hash_add(zobj->properties, prop_info->name, &zv);
                                                }
-
-                                               ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset));
-                                               zend_hash_add(zobj->properties, prop_info->name, &zv);
-                                       }
-                               } ZEND_HASH_FOREACH_END();
+                                       } ZEND_HASH_FOREACH_END();
+                               }
                        }
                }
        }