Fixed refcount handling

This commit is contained in:
Xinchen Hui 2014-02-28 22:44:50 +08:00
parent 2a82660923
commit 0680cdb4ac
6 changed files with 71 additions and 53 deletions

View file

@ -1639,7 +1639,9 @@ ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */
} }
if (result) { if (result) {
Z_ADDREF_P(result); if (Z_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
return SUCCESS; return SUCCESS;
} else { } else {
return FAILURE; return FAILURE;

View file

@ -284,7 +284,7 @@ static int spl_autoload(zend_string *class_name, zend_string *lc_name, const cha
new_op_array = NULL; new_op_array = NULL;
zend_file_handle_dtor(&file_handle TSRMLS_CC); zend_file_handle_dtor(&file_handle TSRMLS_CC);
} }
STR_FREE(opened_path); STR_RELEASE(opened_path);
if (new_op_array) { if (new_op_array) {
EG(active_op_array) = new_op_array; EG(active_op_array) = new_op_array;
if (!EG(active_symbol_table)) { if (!EG(active_symbol_table)) {

View file

@ -440,49 +440,52 @@ static void spl_array_write_dimension_ex(int check_inherited, zval *object, zval
zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited"); zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited");
return; return;
} }
Z_ADDREF_P(value); if (Z_REFCOUNTED_P(value)) {
Z_ADDREF_P(value);
}
zend_hash_next_index_insert(ht, value); zend_hash_next_index_insert(ht, value);
return; return;
} }
switch(Z_TYPE_P(offset)) {
case IS_STRING: if (Z_REFCOUNTED_P(value)) {
ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (ht->nApplyCount > 0) {
zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited");
return;
}
Z_ADDREF_P(value); Z_ADDREF_P(value);
zend_symtable_update(ht, Z_STR_P(offset), value); }
return; switch (Z_TYPE_P(offset)) {
case IS_DOUBLE: case IS_STRING:
case IS_RESOURCE: ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
case IS_BOOL: if (ht->nApplyCount > 0) {
case IS_LONG: zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited");
ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC); return;
if (ht->nApplyCount > 0) { }
zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited"); zend_symtable_update(ht, Z_STR_P(offset), value);
return; return;
} case IS_DOUBLE:
if (offset->type == IS_DOUBLE) { case IS_RESOURCE:
index = (long)Z_DVAL_P(offset); case IS_BOOL:
} else { case IS_LONG:
index = Z_LVAL_P(offset); ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
} if (ht->nApplyCount > 0) {
Z_ADDREF_P(value); zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited");
zend_hash_index_update(ht, index, value); return;
return; }
case IS_NULL: if (offset->type == IS_DOUBLE) {
ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC); index = (long)Z_DVAL_P(offset);
if (ht->nApplyCount > 0) { } else {
zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited"); index = Z_LVAL_P(offset);
}
zend_hash_index_update(ht, index, value);
return;
case IS_NULL:
ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (ht->nApplyCount > 0) {
zend_error(E_WARNING, "Modification of ArrayObject during sorting is prohibited");
return;
}
zend_hash_next_index_insert(ht, value);
return;
default:
zend_error(E_WARNING, "Illegal offset type");
return; return;
}
Z_ADDREF_P(value);
zend_hash_next_index_insert(ht, value);
return;
default:
zend_error(E_WARNING, "Illegal offset type");
return;
} }
} /* }}} */ } /* }}} */

View file

@ -119,7 +119,7 @@ static void spl_ptr_llist_zval_dtor(spl_ptr_llist_element *elem TSRMLS_DC) { /*
static void spl_ptr_llist_zval_ctor(spl_ptr_llist_element *elem TSRMLS_DC) { /* {{{ */ static void spl_ptr_llist_zval_ctor(spl_ptr_llist_element *elem TSRMLS_DC) { /* {{{ */
if (Z_REFCOUNTED(elem->data)) { if (Z_REFCOUNTED(elem->data)) {
Z_ADDREF_P(&elem->data); Z_ADDREF(elem->data);
} }
} }
/* }}} */ /* }}} */
@ -527,7 +527,9 @@ static HashTable* spl_dllist_object_get_debug_info(zval *obj, int *is_temp TSRML
next = current->next; next = current->next;
add_index_zval(&dllist_array, i, &current->data); add_index_zval(&dllist_array, i, &current->data);
Z_ADDREF_P(&current->data); if (Z_REFCOUNTED(current->data)) {
Z_ADDREF(current->data);
}
i++; i++;
current = next; current = next;
@ -1234,7 +1236,9 @@ SPL_METHOD(SplDoublyLinkedList, add)
return; return;
} }
Z_ADDREF_P(value); if (Z_REFCOUNTED_P(value)) {
Z_ADDREF_P(value);
}
if (index == intern->llist->count) { if (index == intern->llist->count) {
/* If index is the last entry+1 then we do a push because we're not inserting before any entry */ /* If index is the last entry+1 then we do a push because we're not inserting before any entry */
spl_ptr_llist_push(intern->llist, value TSRMLS_CC); spl_ptr_llist_push(intern->llist, value TSRMLS_CC);

View file

@ -166,7 +166,9 @@ static HashTable* spl_fixedarray_object_get_properties(zval *obj TSRMLS_DC) /* {
for (i = 0; i < intern->array->size; i++) { for (i = 0; i < intern->array->size; i++) {
if (!ZVAL_IS_UNDEF(&intern->array->elements[i])) { if (!ZVAL_IS_UNDEF(&intern->array->elements[i])) {
zend_hash_index_update(ht, i, &intern->array->elements[i]); zend_hash_index_update(ht, i, &intern->array->elements[i]);
Z_ADDREF_P(&intern->array->elements[i]); if (Z_REFCOUNTED(intern->array->elements[i])){
Z_ADDREF(intern->array->elements[i]);
}
} else { } else {
zend_hash_index_update(ht, i, &EG(uninitialized_zval)); zend_hash_index_update(ht, i, &EG(uninitialized_zval));
} }
@ -596,7 +598,9 @@ SPL_METHOD(SplFixedArray, __wakeup)
spl_fixedarray_init(intern->array, size TSRMLS_CC); spl_fixedarray_init(intern->array, size TSRMLS_CC);
for (zend_hash_internal_pointer_reset_ex(intern_ht, &ptr); (data = zend_hash_get_current_data_ex(intern_ht, &ptr)) != NULL; zend_hash_move_forward_ex(intern_ht, &ptr)) { for (zend_hash_internal_pointer_reset_ex(intern_ht, &ptr); (data = zend_hash_get_current_data_ex(intern_ht, &ptr)) != NULL; zend_hash_move_forward_ex(intern_ht, &ptr)) {
Z_ADDREF_P(data); if (Z_REFCOUNTED_P(data)) {
Z_ADDREF_P(data);
}
ZVAL_COPY_VALUE(&intern->array->elements[index++], data); ZVAL_COPY_VALUE(&intern->array->elements[index++], data);
} }
@ -644,10 +648,11 @@ SPL_METHOD(SplFixedArray, toArray)
for (; i < intern->array->size; i++) { for (; i < intern->array->size; i++) {
if (!ZVAL_IS_UNDEF(&intern->array->elements[i])) { if (!ZVAL_IS_UNDEF(&intern->array->elements[i])) {
zend_hash_index_update(Z_ARRVAL_P(return_value), i, &intern->array->elements[i]); zend_hash_index_update(Z_ARRVAL_P(return_value), i, &intern->array->elements[i]);
Z_ADDREF_P(&intern->array->elements[i]); if (Z_REFCOUNTED(intern->array->elements[i])) {
Z_ADDREF(intern->array->elements[i]);
}
} else { } else {
zend_hash_index_update(Z_ARRVAL_P(return_value), i, &EG(uninitialized_zval)); zend_hash_index_update(Z_ARRVAL_P(return_value), i, &EG(uninitialized_zval));
Z_ADDREF_P(&EG(uninitialized_zval));
} }
} }
} }
@ -1038,8 +1043,6 @@ zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *ob
return NULL; return NULL;
} }
Z_ADDREF_P(object);
iterator = emalloc(sizeof(spl_fixedarray_it)); iterator = emalloc(sizeof(spl_fixedarray_it));
zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);

View file

@ -92,7 +92,9 @@ static void spl_ptr_heap_zval_dtor(zval *elem TSRMLS_DC) { /* {{{ */
/* }}} */ /* }}} */
static void spl_ptr_heap_zval_ctor(zval *elem TSRMLS_DC) { /* {{{ */ static void spl_ptr_heap_zval_ctor(zval *elem TSRMLS_DC) { /* {{{ */
Z_ADDREF_P(elem); if (Z_REFCOUNTED_P(elem)) {
Z_ADDREF_P(elem);
}
} }
/* }}} */ /* }}} */
@ -398,8 +400,8 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zval *o
int i; int i;
intern->heap = spl_ptr_heap_clone(other->heap TSRMLS_CC); intern->heap = spl_ptr_heap_clone(other->heap TSRMLS_CC);
for (i = 0; i < intern->heap->count; ++i) { for (i = 0; i < intern->heap->count; ++i) {
if (!ZVAL_IS_UNDEF(&intern->heap->elements[i])) { if (Z_REFCOUNTED(intern->heap->elements[i])) {
Z_ADDREF_P(&intern->heap->elements[i]); Z_ADDREF(intern->heap->elements[i]);
} }
} }
} else { } else {
@ -537,7 +539,9 @@ static HashTable* spl_heap_object_get_debug_info_helper(zend_class_entry *ce, zv
for (i = 0; i < intern->heap->count; ++i) { for (i = 0; i < intern->heap->count; ++i) {
add_index_zval(&heap_array, i, &intern->heap->elements[i]); add_index_zval(&heap_array, i, &intern->heap->elements[i]);
Z_ADDREF_P(&intern->heap->elements[i]); if (Z_REFCOUNTED(intern->heap->elements[i])) {
Z_ADDREF(intern->heap->elements[i]);
}
} }
pnstr = spl_gen_private_prop_name(ce, "heap", sizeof("heap")-1 TSRMLS_CC); pnstr = spl_gen_private_prop_name(ce, "heap", sizeof("heap")-1 TSRMLS_CC);
@ -710,7 +714,9 @@ SPL_METHOD(SplPriorityQueue, extract)
return; return;
} }
Z_ADDREF_P(value_out); if (Z_REFCOUNTED_P(value_out)) {
Z_ADDREF_P(value_out);
}
zval_ptr_dtor(value); zval_ptr_dtor(value);
RETURN_ZVAL(value_out, 1, 1); RETURN_ZVAL(value_out, 1, 1);