andrei Mon Feb 6 17:42:28 2006 UTC
Modified files:
/php-src/ext/unicode unicode_iterators.c
Log:
Make TextIterator fast again, now that we don't have to worry about
references.
http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.11&r2=1.12&diff_format=u
Index: php-src/ext/unicode/unicode_iterators.c
diff -u php-src/ext/unicode/unicode_iterators.c:1.11
php-src/ext/unicode/unicode_iterators.c:1.12
--- php-src/ext/unicode/unicode_iterators.c:1.11 Sun Feb 5 23:31:47 2006
+++ php-src/ext/unicode/unicode_iterators.c Mon Feb 6 17:42:28 2006
@@ -14,7 +14,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: unicode_iterators.c,v 1.11 2006/02/05 23:31:47 helly Exp $ */
+/* $Id: unicode_iterators.c,v 1.12 2006/02/06 17:42:28 andrei Exp $ */
/*
* TODO
@@ -126,16 +126,11 @@
UChar32 cp;
int32_t tmp, buf_len;
- if (!object->current) {
- MAKE_STD_ZVAL(object->current);
- Z_USTRVAL_P(object->current) = eumalloc(3);
- Z_TYPE_P(object->current) = IS_UNICODE;
- tmp = object->u.cp.offset;
- U16_NEXT(object->text, tmp, object->text_len, cp);
- buf_len = zend_codepoint_to_uchar(cp,
Z_USTRVAL_P(object->current));
- Z_USTRVAL_P(object->current)[buf_len] = 0;
- Z_USTRLEN_P(object->current) = buf_len;
- }
+ tmp = object->u.cp.offset;
+ U16_NEXT(object->text, tmp, object->text_len, cp);
+ buf_len = zend_codepoint_to_uchar(cp, Z_USTRVAL_P(object->current));
+ Z_USTRVAL_P(object->current)[buf_len] = 0;
+ Z_USTRLEN_P(object->current) = buf_len;
}
static int text_iter_cp_key(text_iter_obj* object TSRMLS_DC)
@@ -147,20 +142,12 @@
{
U16_FWD_1(object->text, object->u.cp.offset, object->text_len);
object->u.cp.index++;
- if (object->current) {
- zval_ptr_dtor(&object->current);
- object->current = NULL;
- }
}
static void text_iter_cp_rewind(text_iter_obj *object TSRMLS_DC)
{
object->u.cp.offset = 0;
object->u.cp.index = 0;
- if (object->current) {
- zval_ptr_dtor(&object->current);
- object->current = NULL;
- }
}
static text_iter_ops text_iter_cp_ops = {
@@ -268,9 +255,8 @@
if (intern->text) {
efree(intern->text);
}
- if (intern->current) {
- zval_ptr_dtor(&intern->current);
- }
+ ZVAL_DELREF(intern->current);
+ zval_ptr_dtor(&intern->current);
efree(object);
}
@@ -289,6 +275,10 @@
zend_hash_copy(intern->std.properties, &class_type->default_properties,
(copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
intern->type = ITER_CODE_POINT;
+ MAKE_STD_ZVAL(intern->current); /* pre-allocate buffer for codepoint */
+ Z_USTRVAL_P(intern->current) = eumalloc(3);
+ Z_TYPE_P(intern->current) = IS_UNICODE;
+ ZVAL_ADDREF(intern->current);
retval.handle = zend_objects_store_put(intern,
(zend_objects_store_dtor_t)zend_objects_destroy_object,
(zend_objects_free_object_storage_t) text_iterator_free_storage, NULL
TSRMLS_CC);
retval.handlers = zend_get_std_object_handlers();
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php