summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-02-04 15:24:13 +0300
committerDmitry Stogov <dmitry@zend.com>2015-02-04 15:24:13 +0300
commit9e70d7672dd646b8c9b29ccc452e4dc5aa015437 (patch)
tree0b852db11ab8fdcab020d6f13ee631291849b6d2 /Zend/zend_objects.c
parent87377c1707beec44f35cd6d91e5822a31479f170 (diff)
downloadphp-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.c19
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;