/* }}} */
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;
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;
}
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);
}
}
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);
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) {
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];
}
}
/* }}} */
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);
}
}
/* }}} */
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]);
}
}
/* }}} */
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;
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;
}
/* }}} */
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);
}
/* }}} */
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();
}
intern = Z_SPLFIXEDARRAY_P(object);
- if (intern->array) {
- RETURN_LONG(intern->array->size);
- }
- RETURN_LONG(0);
+ RETURN_LONG(intern->array.size);
}
/* }}} */
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));
SPL_METHOD(SplFixedArray, fromArray)
{
zval *data;
- spl_fixedarray *array;
+ spl_fixedarray array;
spl_fixedarray_object *intern;
int num;
zend_bool save_indexes = 1;
return;
}
- array = ecalloc(1, sizeof(spl_fixedarray));
num = zend_hash_num_elements(Z_ARRVAL_P(data));
if (num > 0 && save_indexes) {
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;
}
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);
}
intern = Z_SPLFIXEDARRAY_P(object);
- if (intern->array) {
- RETURN_LONG(intern->array->size);
- }
- RETURN_LONG(0);
+ RETURN_LONG(intern->array.size);
}
/* }}} */
}
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;
}
/* }}} */
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;
}
return;
}
- RETURN_BOOL(intern->current >= 0 && intern->array && intern->current < intern->array->size);
+ RETURN_BOOL(intern->current >= 0 && intern->current < intern->array.size);
}
/* }}} */