/* }}} */
/* overriden for garbage collection */
-static HashTable *spl_object_storage_get_gc(zval *obj, zval ***table, int *n TSRMLS_DC) /* {{{ */
+static HashTable *spl_object_storage_get_gc(zval *obj, zval **table, int *n) /* {{{ */
{
- long i = 0;
- spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(obj TSRMLS_CC);
+ int i = 0;
+ spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(obj);
spl_SplObjectStorageElement *element;
- HashPosition pos;
- if (intern->storage.nNumOfElements > intern->gcdata_num) {
+ if (intern->storage.nNumOfElements * 2 > intern->gcdata_num) {
intern->gcdata_num = intern->storage.nNumOfElements * 2;
- intern->gcdata = (zval**)erealloc(intern->gcdata, sizeof(zval*) * intern->gcdata_num);
+ intern->gcdata = (zval*)erealloc(intern->gcdata, sizeof(zval) * intern->gcdata_num);
}
- zend_hash_internal_pointer_reset_ex(&intern->storage, &pos);
- while (zend_hash_get_current_data_ex(&intern->storage, (void **)&element, &pos) == SUCCESS) {
- intern->gcdata[i++] = element->obj;
- intern->gcdata[i++] = element->inf;
- zend_hash_move_forward_ex(&intern->storage, &pos);
- }
+ ZEND_HASH_FOREACH_PTR(&intern->storage, element) {
+ ZVAL_COPY_VALUE(&intern->gcdata[i++], &element->obj);
+ ZVAL_COPY_VALUE(&intern->gcdata[i++], &element->inf);
+ } ZEND_HASH_FOREACH_END();
*table = intern->gcdata;
*n = i;