summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r--Zend/zend_objects.c31
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) {