summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_API.c9
-rw-r--r--Zend/zend_objects.c10
-rw-r--r--Zend/zend_objects.h2
-rw-r--r--Zend/zend_operators.c43
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;