From: Andrei Zmievski Date: Mon, 6 Feb 2006 17:42:28 +0000 (+0000) Subject: Make TextIterator fast again, now that we don't have to worry about X-Git-Tag: RELEASE_1_2~255 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1e9fa8c10a50d7c9a1c8ec87880d5be576a6e060;p=php Make TextIterator fast again, now that we don't have to worry about references. --- diff --git a/ext/unicode/unicode_iterators.c b/ext/unicode/unicode_iterators.c index a3de0ae05a..6c79efc4dd 100644 --- a/ext/unicode/unicode_iterators.c +++ b/ext/unicode/unicode_iterators.c @@ -126,16 +126,11 @@ static void text_iter_cp_current(text_iter_obj* object TSRMLS_DC) 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 @@ static void text_iter_cp_next(text_iter_obj* object TSRMLS_DC) { 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 @@ static void text_iterator_free_storage(void *object TSRMLS_DC) 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 @@ static zend_object_value text_iterator_new(zend_class_entry *class_type TSRMLS_D 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();