diff options
Diffstat (limited to 'ext/spl/spl_fixedarray.c')
-rw-r--r-- | ext/spl/spl_fixedarray.c | 145 |
1 files changed, 59 insertions, 86 deletions
diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index e04abf77ea..741b1dbf14 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -49,7 +49,7 @@ typedef struct _spl_fixedarray { /* {{{ */ /* }}} */ typedef struct _spl_fixedarray_object { /* {{{ */ - spl_fixedarray *array; + spl_fixedarray array; zend_function *fptr_offset_get; zend_function *fptr_offset_set; zend_function *fptr_offset_has; @@ -148,13 +148,8 @@ static HashTable* spl_fixedarray_object_get_gc(zval *obj, zval **table, int *n) spl_fixedarray_object *intern = Z_SPLFIXEDARRAY_P(obj); HashTable *ht = zend_std_get_properties(obj); - if (intern->array) { - *table = intern->array->elements; - *n = (int)intern->array->size; - } else { - *table = NULL; - *n = 0; - } + *table = intern->array.elements; + *n = (int)intern->array.size; return ht; } @@ -166,21 +161,21 @@ static HashTable* spl_fixedarray_object_get_properties(zval *obj) /* {{{{ */ HashTable *ht = zend_std_get_properties(obj); zend_long i = 0; - if (intern->array) { + if (intern->array.size > 0) { zend_long j = zend_hash_num_elements(ht); - for (i = 0; i < intern->array->size; i++) { - if (!Z_ISUNDEF(intern->array->elements[i])) { - zend_hash_index_update(ht, i, &intern->array->elements[i]); - if (Z_REFCOUNTED(intern->array->elements[i])){ - Z_ADDREF(intern->array->elements[i]); + for (i = 0; i < intern->array.size; i++) { + if (!Z_ISUNDEF(intern->array.elements[i])) { + zend_hash_index_update(ht, i, &intern->array.elements[i]); + if (Z_REFCOUNTED(intern->array.elements[i])){ + Z_ADDREF(intern->array.elements[i]); } } else { zend_hash_index_update(ht, i, &EG(uninitialized_zval)); } } - if (j > intern->array->size) { - for (i = intern->array->size; i < j; ++i) { + if (j > intern->array.size) { + for (i = intern->array.size; i < j; ++i) { zend_hash_index_del(ht, i); } } @@ -195,15 +190,14 @@ static void spl_fixedarray_object_free_storage(zend_object *object) /* {{{ */ spl_fixedarray_object *intern = spl_fixed_array_from_obj(object); zend_long i; - if (intern->array) { - for (i = 0; i < intern->array->size; i++) { - zval_ptr_dtor(&(intern->array->elements[i])); + if (intern->array.size > 0) { + for (i = 0; i < intern->array.size; i++) { + zval_ptr_dtor(&(intern->array.elements[i])); } - if (intern->array->size > 0 && intern->array->elements) { - efree(intern->array->elements); + if (intern->array.size > 0 && intern->array.elements) { + efree(intern->array.elements); } - efree(intern->array); } zend_object_std_dtor(&intern->std); @@ -229,14 +223,8 @@ static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, z if (orig && clone_orig) { spl_fixedarray_object *other = Z_SPLFIXEDARRAY_P(orig); intern->ce_get_iterator = other->ce_get_iterator; - if (!other->array) { - /* leave a empty object, will be dtor later by CLONE handler */ - zend_throw_exception(spl_ce_RuntimeException, "The instance wasn't initialized properly", 0); - } else { - intern->array = emalloc(sizeof(spl_fixedarray)); - spl_fixedarray_init(intern->array, other->array->size); - spl_fixedarray_copy(intern->array, other->array); - } + spl_fixedarray_init(&intern->array, other->array.size); + spl_fixedarray_copy(&intern->array, &other->array); } while (parent) { @@ -341,13 +329,13 @@ static inline zval *spl_fixedarray_object_read_dimension_helper(spl_fixedarray_o index = Z_LVAL_P(offset); } - if (index < 0 || intern->array == NULL || index >= intern->array->size) { + if (index < 0 || index >= intern->array.size) { zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0); return NULL; - } else if (Z_ISUNDEF(intern->array->elements[index])) { + } else if (Z_ISUNDEF(intern->array.elements[index])) { return NULL; } else { - return &intern->array->elements[index]; + return &intern->array.elements[index]; } } /* }}} */ @@ -394,15 +382,15 @@ static inline void spl_fixedarray_object_write_dimension_helper(spl_fixedarray_o index = Z_LVAL_P(offset); } - if (index < 0 || intern->array == NULL || index >= intern->array->size) { + if (index < 0 || index >= intern->array.size) { zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0); return; } else { - if (!Z_ISUNDEF(intern->array->elements[index])) { - zval_ptr_dtor(&(intern->array->elements[index])); + if (!Z_ISUNDEF(intern->array.elements[index])) { + zval_ptr_dtor(&(intern->array.elements[index])); } ZVAL_DEREF(value); - ZVAL_COPY(&intern->array->elements[index], value); + ZVAL_COPY(&intern->array.elements[index], value); } } /* }}} */ @@ -442,12 +430,12 @@ static inline void spl_fixedarray_object_unset_dimension_helper(spl_fixedarray_o index = Z_LVAL_P(offset); } - if (index < 0 || intern->array == NULL || index >= intern->array->size) { + if (index < 0 || index >= intern->array.size) { zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0); return; } else { - zval_ptr_dtor(&(intern->array->elements[index])); - ZVAL_UNDEF(&intern->array->elements[index]); + zval_ptr_dtor(&(intern->array.elements[index])); + ZVAL_UNDEF(&intern->array.elements[index]); } } /* }}} */ @@ -481,13 +469,13 @@ static inline int spl_fixedarray_object_has_dimension_helper(spl_fixedarray_obje index = Z_LVAL_P(offset); } - if (index < 0 || intern->array == NULL || index >= intern->array->size) { + if (index < 0 || index >= intern->array.size) { retval = 0; } else { - if (Z_ISUNDEF(intern->array->elements[index])) { + if (Z_ISUNDEF(intern->array.elements[index])) { retval = 0; } else if (check_empty) { - if (zend_is_true(&intern->array->elements[index])) { + if (zend_is_true(&intern->array.elements[index])) { retval = 1; } else { retval = 0; @@ -535,14 +523,12 @@ static int spl_fixedarray_object_count_elements(zval *object, zend_long *count) if (!Z_ISUNDEF(rv)) { *count = zval_get_long(&rv); zval_ptr_dtor(&rv); - return SUCCESS; + } else { + *count = 0; } - } else if (intern->array) { - *count = intern->array->size; - return SUCCESS; + } else { + *count = intern->array.size; } - - *count = 0; return SUCCESS; } /* }}} */ @@ -566,13 +552,12 @@ SPL_METHOD(SplFixedArray, __construct) intern = Z_SPLFIXEDARRAY_P(object); - if (intern->array) { + if (intern->array.size > 0) { /* called __construct() twice, bail out */ return; } - intern->array = emalloc(sizeof(spl_fixedarray)); - spl_fixedarray_init(intern->array, size); + spl_fixedarray_init(&intern->array, size); } /* }}} */ @@ -588,18 +573,17 @@ SPL_METHOD(SplFixedArray, __wakeup) return; } - if (!intern->array) { + if (intern->array.size == 0) { int index = 0; int size = zend_hash_num_elements(intern_ht); - intern->array = emalloc(sizeof(spl_fixedarray)); - spl_fixedarray_init(intern->array, size); + spl_fixedarray_init(&intern->array, size); ZEND_HASH_FOREACH_VAL(intern_ht, 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); index++; } ZEND_HASH_FOREACH_END(); @@ -622,10 +606,7 @@ SPL_METHOD(SplFixedArray, count) } intern = Z_SPLFIXEDARRAY_P(object); - if (intern->array) { - RETURN_LONG(intern->array->size); - } - RETURN_LONG(0); + RETURN_LONG(intern->array.size); } /* }}} */ @@ -642,13 +623,13 @@ SPL_METHOD(SplFixedArray, toArray) intern = Z_SPLFIXEDARRAY_P(getThis()); array_init(return_value); - if (intern->array) { + if (intern->array.size > 0) { int i = 0; - for (; i < intern->array->size; i++) { - if (!Z_ISUNDEF(intern->array->elements[i])) { - zend_hash_index_update(Z_ARRVAL_P(return_value), i, &intern->array->elements[i]); - if (Z_REFCOUNTED(intern->array->elements[i])) { - Z_ADDREF(intern->array->elements[i]); + for (; i < intern->array.size; i++) { + if (!Z_ISUNDEF(intern->array.elements[i])) { + zend_hash_index_update(Z_ARRVAL_P(return_value), i, &intern->array.elements[i]); + if (Z_REFCOUNTED(intern->array.elements[i])) { + Z_ADDREF(intern->array.elements[i]); } } else { zend_hash_index_update(Z_ARRVAL_P(return_value), i, &EG(uninitialized_zval)); @@ -663,7 +644,7 @@ SPL_METHOD(SplFixedArray, toArray) SPL_METHOD(SplFixedArray, fromArray) { zval *data; - spl_fixedarray *array; + spl_fixedarray array; spl_fixedarray_object *intern; int num; zend_bool save_indexes = 1; @@ -672,7 +653,6 @@ SPL_METHOD(SplFixedArray, fromArray) return; } - array = ecalloc(1, sizeof(spl_fixedarray)); num = zend_hash_num_elements(Z_ARRVAL_P(data)); if (num > 0 && save_indexes) { @@ -683,7 +663,6 @@ SPL_METHOD(SplFixedArray, fromArray) ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(data), num_index, str_index) { if (str_index != NULL || (zend_long)num_index < 0) { - efree(array); zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0, "array must contain only positive integer keys"); return; } @@ -695,30 +674,29 @@ SPL_METHOD(SplFixedArray, fromArray) tmp = max_index + 1; if (tmp <= 0) { - efree(array); zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0, "integer overflow detected"); return; } - spl_fixedarray_init(array, tmp); + spl_fixedarray_init(&array, tmp); ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(data), num_index, str_index, element) { ZVAL_DEREF(element); - ZVAL_COPY(&array->elements[num_index], element); + ZVAL_COPY(&array.elements[num_index], element); } ZEND_HASH_FOREACH_END(); } else if (num > 0 && !save_indexes) { zval *element; zend_long i = 0; - spl_fixedarray_init(array, num); + spl_fixedarray_init(&array, num); ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(data), element) { ZVAL_DEREF(element); - ZVAL_COPY(&array->elements[i], element); + ZVAL_COPY(&array.elements[i], element); i++; } ZEND_HASH_FOREACH_END(); } else { - spl_fixedarray_init(array, 0); + spl_fixedarray_init(&array, 0); } object_init_ex(return_value, spl_ce_SplFixedArray); @@ -740,10 +718,7 @@ SPL_METHOD(SplFixedArray, getSize) } intern = Z_SPLFIXEDARRAY_P(object); - if (intern->array) { - RETURN_LONG(intern->array->size); - } - RETURN_LONG(0); + RETURN_LONG(intern->array.size); } /* }}} */ @@ -765,11 +740,8 @@ SPL_METHOD(SplFixedArray, setSize) } intern = Z_SPLFIXEDARRAY_P(object); - if (!intern->array) { - intern->array = ecalloc(1, sizeof(spl_fixedarray)); - } - spl_fixedarray_resize(intern->array, size); + spl_fixedarray_resize(&intern->array, size); RETURN_TRUE; } /* }}} */ @@ -873,7 +845,7 @@ static int spl_fixedarray_it_valid(zend_object_iterator *iter) /* {{{ */ return zend_user_it_valid(iter); } - if (object->current >= 0 && object->array && object->current < object->array->size) { + if (object->current >= 0 && object->current < object->array.size) { return SUCCESS; } @@ -967,7 +939,7 @@ SPL_METHOD(SplFixedArray, valid) return; } - RETURN_BOOL(intern->current >= 0 && intern->array && intern->current < intern->array->size); + RETURN_BOOL(intern->current >= 0 && intern->current < intern->array.size); } /* }}} */ @@ -1018,7 +990,8 @@ zend_object_iterator_funcs spl_fixedarray_it_funcs = { spl_fixedarray_it_get_current_data, spl_fixedarray_it_get_current_key, spl_fixedarray_it_move_forward, - spl_fixedarray_it_rewind + spl_fixedarray_it_rewind, + NULL }; zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ |