diff options
author | Dmitry Stogov <dmitry@zend.com> | 2015-06-17 12:50:16 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2015-06-17 12:50:16 +0300 |
commit | 4a6e1345e2dfd1d1edfd18b783bc9000598a4d92 (patch) | |
tree | 05b52f5393e38d86e1a738696a63143289c8f25d /Zend/zend_objects.c | |
parent | e011e6fdf4a7b65d4cf92dcad57f1e4fe4b25b80 (diff) | |
download | php-git-4a6e1345e2dfd1d1edfd18b783bc9000598a4d92.tar.gz |
Use COW to prevent unnecessary duplication of dynamic propertyes of stdClass (and other classes without predefined properties).
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r-- | Zend/zend_objects.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 9007661f03..2a0655b258 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -55,7 +55,11 @@ ZEND_API void zend_object_std_dtor(zend_object *object) zval *p, *end; if (object->properties) { - zend_array_destroy(object->properties); + if (EXPECTED(!(GC_FLAGS(object->properties) & IS_ARRAY_IMMUTABLE))) { + if (EXPECTED(--GC_REFCOUNT(object->properties) == 0)) { + zend_array_destroy(object->properties); + } + } } p = object->properties_table; if (EXPECTED(object->ce->default_properties_count)) { @@ -163,7 +167,17 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o src++; dst++; } while (src != end); + } else if (old_object->properties && !old_object->ce->clone) { + /* fast copy */ + if (EXPECTED(old_object->handlers == &std_object_handlers)) { + if (EXPECTED(!(GC_FLAGS(old_object->properties) & IS_ARRAY_IMMUTABLE))) { + GC_REFCOUNT(old_object->properties)++; + } + new_object->properties = old_object->properties; + return; + } } + if (old_object->properties && EXPECTED(zend_hash_num_elements(old_object->properties))) { zval *prop, new_prop; |