summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-06-17 12:50:16 +0300
committerDmitry Stogov <dmitry@zend.com>2015-06-17 12:50:16 +0300
commit4a6e1345e2dfd1d1edfd18b783bc9000598a4d92 (patch)
tree05b52f5393e38d86e1a738696a63143289c8f25d /Zend/zend_objects.c
parente011e6fdf4a7b65d4cf92dcad57f1e4fe4b25b80 (diff)
downloadphp-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.c16
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;