helly Wed Feb 15 21:34:21 2006 UTC Added files: /php-src/ext/unicode/tests .cvsignore iterator_001.phpt
Modified files: /php-src/ext/unicode unicode_iterators.c Log: - Little speedup + first test http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.20&r2=1.21&diff_format=u Index: php-src/ext/unicode/unicode_iterators.c diff -u php-src/ext/unicode/unicode_iterators.c:1.20 php-src/ext/unicode/unicode_iterators.c:1.21 --- php-src/ext/unicode/unicode_iterators.c:1.20 Mon Feb 13 10:23:58 2006 +++ php-src/ext/unicode/unicode_iterators.c Wed Feb 15 21:34:21 2006 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: unicode_iterators.c,v 1.20 2006/02/13 10:23:58 dmitry Exp $ */ +/* $Id: unicode_iterators.c,v 1.21 2006/02/15 21:34:21 helly Exp $ */ /* * TODO @@ -72,12 +72,16 @@ int32_t end; } brk; } u; + zend_object_iterator iter; } text_iter_obj; -typedef struct { - zend_object_iterator intern; - text_iter_obj* object; -} text_iter_it; +static inline text_iter_obj* text_iter_to_obj(zend_object_iterator *iter) +{ + static text_iter_obj adr; + static int ofs = (char*)&adr.iter - (char*)&adr; + + return (text_iter_obj *)((char*)iter - ofs); +} typedef struct { int (*valid) (text_iter_obj* object TSRMLS_DC); @@ -389,54 +393,51 @@ static void text_iter_dtor(zend_object_iterator* iter TSRMLS_DC) { - text_iter_it* iterator = (text_iter_it *) iter; - zval_ptr_dtor((zval **)&iterator->intern.data); - efree(iterator); + text_iter_obj* obj = text_iter_to_obj(iter); + zval *object = obj->iter.data; + + zval_ptr_dtor(&object); } static int text_iter_valid(zend_object_iterator* iter TSRMLS_DC) { - text_iter_it* iterator = (text_iter_it *) iter; - text_iter_obj* object = iterator->object; + text_iter_obj* obj = text_iter_to_obj(iter); - if (iter_ops[object->type]->valid(object TSRMLS_CC)) + if (iter_ops[obj->type]->valid(obj TSRMLS_CC)) { return SUCCESS; - else + } else { return FAILURE; + } } static void text_iter_get_current_data(zend_object_iterator* iter, zval*** data TSRMLS_DC) { - text_iter_it* iterator = (text_iter_it *) iter; - text_iter_obj* object = iterator->object; + text_iter_obj* obj = text_iter_to_obj(iter); - iter_ops[object->type]->current(object TSRMLS_CC); - *data = &object->current; + iter_ops[obj->type]->current(obj TSRMLS_CC); + *data = &obj->current; } static int text_iter_get_current_key(zend_object_iterator* iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC) { - text_iter_it* iterator = (text_iter_it *) iter; - text_iter_obj* object = iterator->object; + text_iter_obj* obj = text_iter_to_obj(iter); - *int_key = iter_ops[object->type]->key(object TSRMLS_CC); + *int_key = iter_ops[obj->type]->key(obj TSRMLS_CC); return HASH_KEY_IS_LONG; } static void text_iter_move_forward(zend_object_iterator* iter TSRMLS_DC) { - text_iter_it* iterator = (text_iter_it *) iter; - text_iter_obj* object = iterator->object; + text_iter_obj* obj = text_iter_to_obj(iter); - iter_ops[object->type]->next(object TSRMLS_CC); + iter_ops[obj->type]->next(obj TSRMLS_CC); } static void text_iter_rewind(zend_object_iterator* iter TSRMLS_DC) { - text_iter_it* iterator = (text_iter_it *) iter; - text_iter_obj* object = iterator->object; + text_iter_obj* obj = text_iter_to_obj(iter); - iter_ops[object->type]->rewind(object TSRMLS_CC); + iter_ops[obj->type]->rewind(obj TSRMLS_CC); } zend_object_iterator_funcs text_iter_funcs = { @@ -450,21 +451,18 @@ static zend_object_iterator* text_iter_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) { - text_iter_it* iterator; text_iter_obj* iter_object; if (by_ref) { zend_error(E_ERROR, "An iterator cannot be used with foreach by reference"); } - iterator = emalloc(sizeof(text_iter_it)); iter_object = (text_iter_obj *) zend_object_store_get_object(object TSRMLS_CC); ZVAL_ADDREF(object); - iterator->intern.data = (void *) object; - iterator->intern.funcs = &text_iter_funcs; - iterator->object = iter_object; + iter_object->iter.data = (void *) object; + iter_object->iter.funcs = &text_iter_funcs; - return (zend_object_iterator *) iterator; + return (zend_object_iterator *) &iter_object->iter; } static void text_iterator_free_storage(void *object TSRMLS_DC) http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/tests/.cvsignore?view=markup&rev=1.1 Index: php-src/ext/unicode/tests/.cvsignore +++ php-src/ext/unicode/tests/.cvsignore phpt.* *.diff *.log *.exp *.out *.php *.gcda *.gcno http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/tests/iterator_001.phpt?view=markup&rev=1.1 Index: php-src/ext/unicode/tests/iterator_001.phpt +++ php-src/ext/unicode/tests/iterator_001.phpt --TEST-- Unicode: Basic iterator tests --SKIPIF-- <?php if (!unicode_semantics()) die('skip unicode_semantics=off'); ?> --FILE-- <?php foreach(new TextIterator("123") as $char) { var_dump($char); } foreach(new ReverseTextIterator("123") as $char) { var_dump($char); } ?> ===DONE=== --EXPECTF-- unicode(1) "1" unicode(1) "2" unicode(1) "3" unicode(1) "3" unicode(1) "2" unicode(1) "1" ===DONE=== -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php