diff options
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r-- | Zend/zend_objects.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 11daa0646a..00d124ff24 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -27,15 +27,14 @@ #include "zend_interfaces.h" #include "zend_exceptions.h" -ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce) +ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce) { - GC_REFCOUNT(object) = 1; + GC_SET_REFCOUNT(object, 1); GC_TYPE_INFO(object) = IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT); object->ce = ce; object->properties = NULL; zend_objects_store_put(object); if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) { - GC_FLAGS(object) |= IS_OBJ_USE_GUARDS; ZVAL_UNDEF(object->properties_table + object->ce->default_properties_count); } } @@ -46,7 +45,7 @@ ZEND_API void zend_object_std_dtor(zend_object *object) if (object->properties) { if (EXPECTED(!(GC_FLAGS(object->properties) & IS_ARRAY_IMMUTABLE))) { - if (EXPECTED(--GC_REFCOUNT(object->properties) == 0)) { + if (EXPECTED(GC_DELREF(object->properties) == 0)) { zend_array_destroy(object->properties); } } @@ -59,13 +58,12 @@ ZEND_API void zend_object_std_dtor(zend_object *object) p++; } while (p != end); } - if (UNEXPECTED(GC_FLAGS(object) & IS_OBJ_HAS_GUARDS)) { + if (UNEXPECTED(object->ce->ce_flags & ZEND_ACC_USE_GUARDS)) { if (EXPECTED(Z_TYPE_P(p) == IS_STRING)) { - zend_string_release(Z_STR_P(p)); - } else { + zend_string_release_ex(Z_STR_P(p), 0); + } else if (Z_TYPE_P(p) == IS_ARRAY) { HashTable *guards; - ZEND_ASSERT(Z_TYPE_P(p) == IS_ARRAY); guards = Z_ARRVAL_P(p); ZEND_ASSERT(guards != NULL); zend_hash_destroy(guards); @@ -125,7 +123,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object) } } - GC_REFCOUNT(object)++; + GC_ADDREF(object); ZVAL_OBJ(&obj, object); /* Make sure that destructors are protected from previously thrown exceptions. @@ -156,7 +154,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object) } } -ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) +ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce) { zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce)); @@ -165,7 +163,7 @@ ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) return object; } -ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *old_object) +ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zend_object *old_object) { if (old_object->ce->default_properties_count) { zval *src = old_object->properties_table; @@ -183,7 +181,7 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o /* 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)++; + GC_ADDREF(old_object->properties); } new_object->properties = old_object->properties; return; @@ -197,15 +195,14 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o zend_string *key; if (!new_object->properties) { - ALLOC_HASHTABLE(new_object->properties); - zend_hash_init(new_object->properties, zend_hash_num_elements(old_object->properties), NULL, ZVAL_PTR_DTOR, 0); - zend_hash_real_init(new_object->properties, 0); + new_object->properties = zend_new_array(zend_hash_num_elements(old_object->properties)); + zend_hash_real_init_mixed(new_object->properties); } else { zend_hash_extend(new_object->properties, new_object->properties->nNumUsed + zend_hash_num_elements(old_object->properties), 0); } - new_object->properties->u.v.flags |= - old_object->properties->u.v.flags & HASH_FLAG_HAS_EMPTY_IND; + HT_FLAGS(new_object->properties) |= + HT_FLAGS(old_object->properties) & HASH_FLAG_HAS_EMPTY_IND; ZEND_HASH_FOREACH_KEY_VAL(old_object->properties, num_key, key, prop) { if (Z_TYPE_P(prop) == IS_INDIRECT) { |