diff options
-rw-r--r-- | Zend/zend_API.c | 9 | ||||
-rw-r--r-- | Zend/zend_objects.c | 10 | ||||
-rw-r--r-- | Zend/zend_objects.h | 2 | ||||
-rw-r--r-- | Zend/zend_operators.c | 43 |
4 files changed, 38 insertions, 26 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 04bb78d8bb..b6a2012e18 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -575,14 +575,11 @@ ZEND_API int _object_init_ex(zval *arg, zend_class_entry *class_type ZEND_FILE_L class_type->constants_updated = 1; } - arg->value.obj = zend_objects_new(&object); + arg->type = IS_OBJECT; + arg->value.obj = zend_objects_new(&object, class_type); - ALLOC_HASHTABLE_REL(object->properties); - zend_hash_init(object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(object->properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); - object->ce = class_type; - - arg->type = IS_OBJECT; + return SUCCESS; } diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 52b7fa9993..2756c4993d 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -1,5 +1,6 @@ #include "zend.h" #include "zend_globals.h" +#include "zend_variables.h" #define ZEND_DEBUG_OBJECTS 0 @@ -24,7 +25,7 @@ void zend_objects_destroy(zend_objects *objects) efree(objects->object_buckets); } -zend_object_value zend_objects_new(zend_object **object) +zend_object_value zend_objects_new(zend_object **object, zend_class_entry *class_type) { zend_object_handle handle; zend_object_value retval; @@ -43,7 +44,14 @@ zend_object_value zend_objects_new(zend_object **object) } EG(objects).object_buckets[handle].valid = 1; EG(objects).object_buckets[handle].bucket.obj.refcount = 1; + *object = &EG(objects).object_buckets[handle].bucket.obj.object; + + (*object)->ce = class_type; + /* Try and change ALLOC_HASHTABLE to ALLOC_HASHTABLE_REL by also fixing this function's prototype */ + ALLOC_HASHTABLE((*object)->properties); + zend_hash_init((*object)->properties, 0, NULL, ZVAL_PTR_DTOR, 0); + retval.handle = handle; retval.handlers = zoh; #if ZEND_DEBUG_OBJECTS diff --git a/Zend/zend_objects.h b/Zend/zend_objects.h index 30660a6666..04b0626edd 100644 --- a/Zend/zend_objects.h +++ b/Zend/zend_objects.h @@ -25,7 +25,7 @@ typedef struct _zend_objects { void zend_objects_init(zend_objects *objects, zend_uint init_size); void zend_objects_destroy(zend_objects *objects); -zend_object_value zend_objects_new(zend_object **object); +zend_object_value zend_objects_new(zend_object **object, zend_class_entry *class_type); zend_object *zend_objects_get_address(zend_object_handle handle); void zend_objects_add_ref(zend_object_handle handle); void zend_objects_del_ref(zend_object_handle handle); diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 947fa939a6..59cd316ffc 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -495,13 +495,14 @@ static void convert_scalar_to_array(zval *op, int type) zend_hash_index_update(op->value.ht, 0, (void *) &entry, sizeof(zval *), NULL); op->type = IS_ARRAY; break; -/* OBJECTS_FIXME */ case IS_OBJECT: - ALLOC_HASHTABLE(Z_OBJPROP_P(op)); - zend_hash_init(Z_OBJPROP_P(op), 0, NULL, ZVAL_PTR_DTOR, 0); - zend_hash_update(Z_OBJPROP_P(op), "scalar", sizeof("scalar"), (void *) &entry, sizeof(zval *), NULL); - Z_OBJCE_P(op) = &zend_standard_class_def; - Z_TYPE_P(op) = IS_OBJECT; + { + /* OBJECTS_OPTIMIZE */ + TSRMLS_FETCH(); + + object_init(op); + zend_hash_update(Z_OBJPROP_P(op), "scalar", sizeof("scalar"), (void *) &entry, sizeof(zval *), NULL); + } break; } } @@ -533,22 +534,28 @@ ZEND_API void convert_to_array(zval *op) ZEND_API void convert_to_object(zval *op) { switch(op->type) { -/* OBJECTS_FIXME */ case IS_ARRAY: - Z_TYPE_P(op) = IS_OBJECT; - Z_OBJPROP_P(op) = op->value.ht; - Z_OBJCE_P(op) = &zend_standard_class_def; - return; - break; + { + /* OBJECTS_OPTIMIZE */ + TSRMLS_FETCH(); + + object_init(op); + zend_hash_destroy(Z_OBJPROP_P(op)); + FREE_HASHTABLE(Z_OBJPROP_P(op)); + Z_OBJPROP_P(op) = op->value.ht; + return; + break; + } case IS_OBJECT: return; -/* OBJECTS_FIXME */ case IS_NULL: - ALLOC_HASHTABLE(Z_OBJPROP_P(op)); - zend_hash_init(Z_OBJPROP_P(op), 0, NULL, ZVAL_PTR_DTOR, 0); - Z_OBJCE_P(op) = &zend_standard_class_def; - Z_TYPE_P(op) = IS_OBJECT; - break; + { + /* OBJECTS_OPTIMIZE */ + TSRMLS_FETCH(); + + object_init(op); + break; + } default: convert_scalar_to_array(op, IS_OBJECT); break; |