Browse Source

- Fix some places which create objects. The fixes are ugly and will be

revised when things start working well
migration/unlabaled-1.67.2
Andi Gutmans 25 years ago
parent
commit
532677e7ac
  1. 9
      Zend/zend_API.c
  2. 10
      Zend/zend_objects.c
  3. 2
      Zend/zend_objects.h
  4. 43
      Zend/zend_operators.c

9
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;
}

10
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

2
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);

43
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;

Loading…
Cancel
Save