summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c43
1 files changed, 25 insertions, 18 deletions
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;