]> granicus.if.org Git - php/commitdiff
- Fix some places which create objects. The fixes are ugly and will be
authorAndi Gutmans <andi@php.net>
Sat, 11 Aug 2001 18:04:07 +0000 (18:04 +0000)
committerAndi Gutmans <andi@php.net>
Sat, 11 Aug 2001 18:04:07 +0000 (18:04 +0000)
  revised when things start working well

Zend/zend_API.c
Zend/zend_objects.c
Zend/zend_objects.h
Zend/zend_operators.c

index 04bb78d8bb769040f7b2e5a85054c77bd1ca8ccb..b6a2012e18d2ad3cac046fe2cfebc04bcd1fbf34 100644 (file)
@@ -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;
 }
 
index 52b7fa99931d1dc85d927212ff14ed498189d3d3..2756c4993d98e0baa44c83f71327e3a94ba01e90 100644 (file)
@@ -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
index 30660a66662bb16018c326e824d699a320362250..04b0626edd14302537654d9bb6ef29a493107344 100644 (file)
@@ -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);
index 947fa939a6f22a08cfe385b9cb72d4f691aad98b..59cd316ffcb3ed8002f627c55eaca6df10b9d3d6 100644 (file)
@@ -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;