From 556d7526671e4b02036bb790b4e715382404585c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 9 Apr 2021 00:40:17 +0300 Subject: [PATCH] Prevent call of var_push_dtor_value() on hot path. When serialising object properties, they are oftet may override the default values, however default values are most often scalars, interned strings or immutable arrays. --- ext/standard/var_unserializer.re | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 84946a18637..5c187fbda2a 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -618,18 +618,22 @@ declared_property: (*var_hash)->ref_props, (zend_uintptr_t) data); } } - var_push_dtor_value(var_hash, data); + /* We may override default property value, but they are usually immutable */ + if (Z_REFCOUNTED_P(data)) { + var_push_dtor_value(var_hash, data); + } ZVAL_NULL(data); } else { + /* Unusual override of dynamic property */ int ret = is_property_visibility_changed(obj->ce, &key); - if (EXPECTED(!ret)) { + if (ret > 0) { + goto second_try; + } else if (!ret) { var_push_dtor_value(var_hash, data); ZVAL_NULL(data); } else if (ret < 0) { goto failure; - } else { - goto second_try; } } } else { @@ -644,7 +648,7 @@ second_try: data = zend_hash_lookup(ht, Z_STR(key)); if (Z_TYPE_P(data) == IS_INDIRECT) { goto declared_property; - } else if (UNEXPECTED(Z_TYPE_P(data) != IS_NULL)) { + } else if (UNEXPECTED(Z_TYPE_INFO_P(data) != IS_NULL)) { var_push_dtor_value(var_hash, data); ZVAL_NULL(data); }