helly Sun Nov 12 17:56:14 2006 UTC Modified files: /php-src/ext/spl spl_directory.c spl_directory.h Log: - Optimize SPL directory stuff by making iterator part of object
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.104&r2=1.105&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.104 php-src/ext/spl/spl_directory.c:1.105 --- php-src/ext/spl/spl_directory.c:1.104 Sun Nov 12 17:08:45 2006 +++ php-src/ext/spl/spl_directory.c Sun Nov 12 17:56:14 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.104 2006/11/12 17:08:45 bjori Exp $ */ +/* $Id: spl_directory.c,v 1.105 2006/11/12 17:56:14 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -88,6 +88,7 @@ case SPL_FS_DIR: if (intern->u.dir.dirp) { php_stream_close(intern->u.dir.dirp); + intern->u.dir.dirp = NULL; } if (intern->u.dir.sub_path) { efree(intern->u.dir.sub_path); @@ -977,13 +978,6 @@ } /* }}} */ -/* define an overloaded iterator structure */ -typedef struct { - zend_object_iterator intern; - zval *current; - spl_filesystem_object *object; -} spl_filesystem_dir_it; - /* forward declarations to the iterator handlers */ static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC); static int spl_filesystem_dir_it_valid(zend_object_iterator *iter TSRMLS_DC); @@ -1005,20 +999,19 @@ /* {{{ spl_ce_dir_get_iterator */ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) { - spl_filesystem_dir_it *iterator; - spl_filesystem_object *dir_object; + spl_filesystem_iterator *iterator; + spl_filesystem_object *dir_object; if (by_ref) { zend_error(E_ERROR, "An iterator cannot be used with foreach by reference"); } - iterator = emalloc(sizeof(spl_filesystem_dir_it)); dir_object = (spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC); + iterator = spl_filesystem_object_to_iterator(dir_object); - object->refcount += 2;; + object->refcount += 2; iterator->intern.data = (void*)object; iterator->intern.funcs = &spl_filesystem_dir_it_funcs; iterator->current = object; - iterator->object = dir_object; return (zend_object_iterator*)iterator; } @@ -1027,20 +1020,18 @@ /* {{{ spl_filesystem_dir_it_dtor */ static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; + spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; zval_ptr_dtor(&iterator->current); zval_ptr_dtor((zval**)&iterator->intern.data); - - efree(iterator); + iterator->intern.data = NULL; /* mark as unused */ } /* }}} */ /* {{{ spl_filesystem_dir_it_valid */ static int spl_filesystem_dir_it_valid(zend_object_iterator *iter TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter); return object->u.dir.entry.d_name[0] != '\0' ? SUCCESS : FAILURE; } @@ -1050,7 +1041,7 @@ /* {{{ spl_filesystem_dir_it_current_data */ static void spl_filesystem_dir_it_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; + spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; *data = &iterator->current; } @@ -1059,8 +1050,7 @@ /* {{{ spl_filesystem_dir_it_current_key */ static int spl_filesystem_dir_it_current_key(zend_object_iterator *iter, zstr *str_key, uint *str_key_len, ulong *int_key TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter); *int_key = object->u.dir.index; return HASH_KEY_IS_LONG; @@ -1070,8 +1060,7 @@ /* {{{ spl_filesystem_dir_it_move_forward */ static void spl_filesystem_dir_it_move_forward(zend_object_iterator *iter TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter); object->u.dir.index++; if (!object->u.dir.dirp || !php_stream_readdir(object->u.dir.dirp, &object->u.dir.entry)) { @@ -1087,8 +1076,7 @@ /* {{{ spl_filesystem_dir_it_rewind */ static void spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter); object->u.dir.index = 0; if (object->u.dir.dirp) { @@ -1103,22 +1091,21 @@ /* {{{ spl_filesystem_tree_it_dtor */ static void spl_filesystem_tree_it_dtor(zend_object_iterator *iter TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; + spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; if (iterator->current) { zval_ptr_dtor(&iterator->current); } zval_ptr_dtor((zval**)&iterator->intern.data); - - efree(iterator); + iterator->intern.data = NULL; /* mark as unused */ } /* }}} */ /* {{{ spl_filesystem_tree_it_current_data */ static void spl_filesystem_tree_it_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; + spl_filesystem_object *object = spl_filesystem_iterator_to_object(iterator); if (object->flags & SPL_FILE_DIR_CURRENT_AS_PATHNAME) { if (!iterator->current) { @@ -1143,8 +1130,7 @@ /* {{{ spl_filesystem_tree_it_current_key */ static int spl_filesystem_tree_it_current_key(zend_object_iterator *iter, zstr *str_key, uint *str_key_len, ulong *int_key TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter); if (object->flags & SPL_FILE_DIR_KEY_AS_FILENAME) { *str_key_len = strlen(object->u.dir.entry.d_name) + 1; @@ -1161,8 +1147,8 @@ /* {{{ spl_filesystem_tree_it_move_forward */ static void spl_filesystem_tree_it_move_forward(zend_object_iterator *iter TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; + spl_filesystem_object *object = spl_filesystem_iterator_to_object(iterator); object->u.dir.index++; do { @@ -1184,8 +1170,8 @@ /* {{{ spl_filesystem_tree_it_rewind */ static void spl_filesystem_tree_it_rewind(zend_object_iterator *iter TSRMLS_DC) { - spl_filesystem_dir_it *iterator = (spl_filesystem_dir_it *)iter; - spl_filesystem_object *object = iterator->object; + spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; + spl_filesystem_object *object = spl_filesystem_iterator_to_object(iterator); object->u.dir.index = 0; if (object->u.dir.dirp) { @@ -1216,20 +1202,19 @@ /* {{{ spl_ce_dir_get_iterator */ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) { - spl_filesystem_dir_it *iterator; + spl_filesystem_iterator *iterator; spl_filesystem_object *dir_object; if (by_ref) { zend_error(E_ERROR, "An iterator cannot be used with foreach by reference"); } - iterator = emalloc(sizeof(spl_filesystem_dir_it)); dir_object = (spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC); + iterator = spl_filesystem_object_to_iterator(dir_object); object->refcount++; iterator->intern.data = (void*)object; iterator->intern.funcs = &spl_filesystem_tree_it_funcs; iterator->current = NULL; - iterator->object = dir_object; return (zend_object_iterator*)iterator; } http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.26&r2=1.27&diff_format=u Index: php-src/ext/spl/spl_directory.h diff -u php-src/ext/spl/spl_directory.h:1.26 php-src/ext/spl/spl_directory.h:1.27 --- php-src/ext/spl/spl_directory.h:1.26 Sun Nov 12 15:58:05 2006 +++ php-src/ext/spl/spl_directory.h Sun Nov 12 17:56:14 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h,v 1.26 2006/11/12 15:58:05 helly Exp $ */ +/* $Id: spl_directory.h,v 1.27 2006/11/12 17:56:14 helly Exp $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H @@ -48,6 +48,12 @@ spl_foreign_clone_t clone; } spl_other_handler; +/* define an overloaded iterator structure */ +typedef struct { + zend_object_iterator intern; + zval *current; +} spl_filesystem_iterator; + struct _spl_filesystem_object { zend_object std; void *oth; @@ -86,8 +92,19 @@ char enclosure; } file; } u; + spl_filesystem_iterator it; }; +static inline spl_filesystem_iterator* spl_filesystem_object_to_iterator(spl_filesystem_object *obj) +{ + return &obj->it; +} + +static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_filesystem_iterator *it) +{ + return (spl_filesystem_object*)((char*)it - offsetof(spl_filesystem_object, it)); +} + #define SPL_FILE_OBJECT_DROP_NEW_LINE 0x00000001 /* drop new lines */ #define SPL_FILE_OBJECT_READ_AHEAD 0x00000002 /* read on rewind/next */ #define SPL_FILE_OBJECT_SKIP_EMPTY 0x00000006 /* skip empty lines */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php