Index: ext/spl/spl_fastarray.c =================================================================== RCS file: /repository/php-src/ext/spl/Attic/spl_fastarray.c,v retrieving revision 1.1.2.8 diff -u -p -r1.1.2.8 spl_fastarray.c --- ext/spl/spl_fastarray.c 12 Jun 2008 12:40:13 -0000 1.1.2.8 +++ ext/spl/spl_fastarray.c 18 Jun 2008 15:52:43 -0000 @@ -570,6 +570,91 @@ SPL_METHOD(SplFastArray, count) } /* }}} */ +/* {{{ proto object SplFastArray::convert(array data[, bool save_indexes]) +*/ +SPL_METHOD(SplFastArray, convert) +{ + zval *data; + spl_fastarray *array; + spl_fastarray_object *intern; + int num; + zend_bool save_indexes = 1; + + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &data, &save_indexes)) { + return; + } + + array = ecalloc(1, sizeof(*array)); + num = zend_hash_num_elements(Z_ARRVAL_P(data)); + + if (num > 0 && save_indexes) { + zval **element, *value; + char *str_index; + ulong num_index; + long tmp; + + zend_hash_internal_pointer_end(Z_ARRVAL_P(data)); + if (zend_hash_get_current_key(Z_ARRVAL_P(data), &str_index, &num_index, 0) != HASH_KEY_IS_LONG || (long)num_index < 0) { + efree(array); + zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "array must contain only positive integer keys"); + return; + } + + tmp = num_index + 1; + if (tmp <= 0) { + efree(array); + zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "integer overflow detected"); + return; + } + spl_fastarray_init(array, tmp TSRMLS_CC); + + for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(data)); + zend_hash_get_current_data(Z_ARRVAL_P(data), (void **) &element) == SUCCESS; + zend_hash_move_forward(Z_ARRVAL_P(data)) + ) { + + if (zend_hash_get_current_key(Z_ARRVAL_P(data), &str_index, &num_index, 0) != HASH_KEY_IS_LONG || (long)num_index < 0) { + spl_fastarray_resize(array, 0 TSRMLS_CC); + efree(array); + zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "array must contain only positive integer keys"); + return; + } + + value = *element; + + SEPARATE_ARG_IF_REF(value); + array->elements[num_index] = value; + } + + } else if (num > 0 && !save_indexes) { + zval **element, *value; + long i = 0; + + spl_fastarray_init(array, num TSRMLS_CC); + + for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(data)); + zend_hash_get_current_data(Z_ARRVAL_P(data), (void **) &element) == SUCCESS; + zend_hash_move_forward(Z_ARRVAL_P(data)) + ) { + + value = *element; + + SEPARATE_ARG_IF_REF(value); + array->elements[i] = value; + i++; + } + } else { + spl_fastarray_init(array, 0 TSRMLS_CC); + } + + object_init_ex(return_value, spl_ce_SplFastArray); + Z_TYPE_P(return_value) = IS_OBJECT; + + intern = (spl_fastarray_object *)zend_object_store_get_object(return_value TSRMLS_CC); + intern->array = array; +} +/* }}} */ + /* {{{ proto int SplFastArray::getSize(void) */ SPL_METHOD(SplFastArray, getSize) @@ -920,9 +1005,16 @@ ZEND_BEGIN_ARG_INFO(arginfo_fastarray_se ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() +static +ZEND_BEGIN_ARG_INFO_EX(arginfo_fastarray_convert, 0, 0, 1) + ZEND_ARG_INFO(0, data) + ZEND_ARG_INFO(0, save_indexes) +ZEND_END_ARG_INFO() + static zend_function_entry spl_funcs_SplFastArray[] = { /* {{{ */ SPL_ME(SplFastArray, __construct, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplFastArray, count, NULL, ZEND_ACC_PUBLIC) + SPL_ME(SplFastArray, convert, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) SPL_ME(SplFastArray, getSize, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplFastArray, setSize, arginfo_fastarray_setSize, ZEND_ACC_PUBLIC) SPL_ME(SplFastArray, offsetExists, arginfo_fastarray_offsetGet, ZEND_ACC_PUBLIC)