diff options
author | Dmitry Stogov <dmitry@zend.com> | 2015-02-04 15:24:13 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2015-02-04 15:24:13 +0300 |
commit | 9e70d7672dd646b8c9b29ccc452e4dc5aa015437 (patch) | |
tree | 0b852db11ab8fdcab020d6f13ee631291849b6d2 /Zend/zend_objects.c | |
parent | 87377c1707beec44f35cd6d91e5822a31479f170 (diff) | |
download | php-git-9e70d7672dd646b8c9b29ccc452e4dc5aa015437.tar.gz |
Move zend_object->guards into additional slot of zend_object->properties_table[]. As result size of objects without __get/__set/__unset/__isset magic methods is reduced.
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r-- | Zend/zend_objects.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 8ba1f5a78d..60e446b4fd 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -32,7 +32,6 @@ ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce) GC_TYPE_INFO(object) = IS_OBJECT; object->ce = ce; object->properties = NULL; - object->guards = NULL; zend_objects_store_put(object); if (EXPECTED(ce->default_properties_count != 0)) { zval *p = object->properties_table; @@ -43,16 +42,17 @@ ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce) p++; } while (p != end); } + if (ce->ce_flags & ZEND_ACC_USE_GUARDS) { + GC_FLAGS(object) |= IS_OBJ_USE_GUARDS; + ZVAL_UNDEF(&object->properties_table[ce->default_properties_count]); + Z_PTR(object->properties_table[ce->default_properties_count]) = NULL; + } } ZEND_API void zend_object_std_dtor(zend_object *object) { int i, count; - if (object->guards) { - zend_hash_destroy(object->guards); - FREE_HASHTABLE(object->guards); - } if (object->properties) { zend_array_destroy(object->properties); FREE_HASHTABLE(object->properties); @@ -61,6 +61,13 @@ ZEND_API void zend_object_std_dtor(zend_object *object) for (i = 0; i < count; i++) { i_zval_ptr_dtor(&object->properties_table[i] ZEND_FILE_LINE_CC); } + if (GC_FLAGS(object) & IS_OBJ_HAS_GUARDS) { + HashTable *guards = Z_PTR(object->properties_table[count]); + + ZEND_ASSERT(guards != NULL); + zend_hash_destroy(guards); + FREE_HASHTABLE(guards); + } } ZEND_API void zend_objects_destroy_object(zend_object *object) @@ -131,7 +138,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object) ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) { - zend_object *object = emalloc(sizeof(zend_object) + sizeof(zval) * (ce->default_properties_count - 1)); + zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce)); zend_object_std_init(object, ce); object->handlers = &std_object_handlers; |