diff options
Diffstat (limited to 'ext/intl/breakiterator/breakiterator_iterators.cpp')
-rw-r--r-- | ext/intl/breakiterator/breakiterator_iterators.cpp | 112 |
1 files changed, 46 insertions, 66 deletions
diff --git a/ext/intl/breakiterator/breakiterator_iterators.cpp b/ext/intl/breakiterator/breakiterator_iterators.cpp index 55112c1f5a..a5b7834847 100644 --- a/ext/intl/breakiterator/breakiterator_iterators.cpp +++ b/ext/intl/breakiterator/breakiterator_iterators.cpp @@ -39,8 +39,7 @@ static zend_object_handlers IntlPartsIterator_handlers; inline BreakIterator *_breakiter_prolog(zend_object_iterator *iter TSRMLS_DC) { BreakIterator_object *bio; - bio = (BreakIterator_object*)zend_object_store_get_object( - (const zval*)iter->data TSRMLS_CC); + bio = Z_INTL_BREAKITERATOR_P(&iter->data); intl_errors_reset(BREAKITER_ERROR_P(bio) TSRMLS_CC); if (bio->biter == NULL) { intl_errors_set(BREAKITER_ERROR_P(bio), U_INVALID_STATE_ERROR, @@ -52,7 +51,7 @@ inline BreakIterator *_breakiter_prolog(zend_object_iterator *iter TSRMLS_DC) static void _breakiterator_destroy_it(zend_object_iterator *iter TSRMLS_DC) { - zval_ptr_dtor((zval**)&iter->data); + zval_ptr_dtor(&iter->data); } static void _breakiterator_move_forward(zend_object_iterator *iter TSRMLS_DC) @@ -68,8 +67,7 @@ static void _breakiterator_move_forward(zend_object_iterator *iter TSRMLS_DC) int32_t pos = biter->next(); if (pos != BreakIterator::DONE) { - MAKE_STD_ZVAL(zoi_iter->current); - ZVAL_LONG(zoi_iter->current, (long)pos); + ZVAL_LONG(&zoi_iter->current, (long)pos); } //else we've reached the end of the enum, nothing more is required } @@ -79,8 +77,7 @@ static void _breakiterator_rewind(zend_object_iterator *iter TSRMLS_DC) zoi_with_current *zoi_iter = (zoi_with_current*)iter; int32_t pos = biter->first(); - MAKE_STD_ZVAL(zoi_iter->current); - ZVAL_LONG(zoi_iter->current, (long)pos); + ZVAL_LONG(&zoi_iter->current, (long)pos); } static zend_object_iterator_funcs breakiterator_iterator_funcs = { @@ -103,7 +100,7 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator( return NULL; } - bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC); + bio = Z_INTL_BREAKITERATOR_P(object); BreakIterator *biter = bio->biter; if (biter == NULL) { @@ -112,16 +109,14 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator( return NULL; } - zoi_with_current *zoi_iter = - static_cast<zoi_with_current*>(emalloc(sizeof *zoi_iter)); - zoi_iter->zoi.data = static_cast<void*>(object); + zoi_with_current *zoi_iter = static_cast<zoi_with_current*>(emalloc(sizeof *zoi_iter)); + zend_iterator_init(&zoi_iter->zoi TSRMLS_CC); + ZVAL_COPY(&zoi_iter->zoi.data, object); zoi_iter->zoi.funcs = &breakiterator_iterator_funcs; zoi_iter->zoi.index = 0; zoi_iter->destroy_it = _breakiterator_destroy_it; - zoi_iter->wrapping_obj = NULL; /* not used; object is in zoi.data */ - zoi_iter->current = NULL; - - zval_add_ref(&object); + ZVAL_UNDEF(&zoi_iter->wrapping_obj); /* not used; object is in zoi.data */ + ZVAL_UNDEF(&zoi_iter->current); return reinterpret_cast<zend_object_iterator *>(zoi_iter); } @@ -136,7 +131,7 @@ typedef struct zoi_break_iter_parts { static void _breakiterator_parts_destroy_it(zend_object_iterator *iter TSRMLS_DC) { - zval_ptr_dtor(reinterpret_cast<zval**>(&iter->data)); + zval_ptr_dtor(&iter->data); } static void _breakiterator_parts_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC) @@ -172,23 +167,20 @@ static void _breakiterator_parts_move_forward(zend_object_iterator *iter TSRMLS_ /* else zoi_bit->key_type == PARTS_ITERATOR_KEY_SEQUENTIAL * No need to do anything, the engine increments ->index */ - const char *s = Z_STRVAL_P(bio->text); - int32_t slen = Z_STRLEN_P(bio->text), - len; - char *res; + const char *s = Z_STRVAL(bio->text); + int32_t slen = Z_STRLEN(bio->text); + zend_string *res; if (next == BreakIterator::DONE) { next = slen; } assert(next <= slen && next >= cur); - len = next - cur; - res = static_cast<char*>(emalloc(len + 1)); + res = STR_ALLOC(next - cur, 0); - memcpy(res, &s[cur], len); - res[len] = '\0'; + memcpy(res->val, &s[cur], res->len); + res->val[res->len] = '\0'; - MAKE_STD_ZVAL(zoi_bit->zoi_cur.current); - ZVAL_STRINGL(zoi_bit->zoi_cur.current, res, len, 0); + ZVAL_STR(&zoi_bit->zoi_cur.current, res); } static void _breakiterator_parts_rewind(zend_object_iterator *iter TSRMLS_DC) @@ -196,7 +188,7 @@ static void _breakiterator_parts_rewind(zend_object_iterator *iter TSRMLS_DC) zoi_break_iter_parts *zoi_bit = (zoi_break_iter_parts*)iter; BreakIterator_object *bio = zoi_bit->bio; - if (zoi_bit->zoi_cur.current) { + if (!Z_ISUNDEF(zoi_bit->zoi_cur.current)) { iter->funcs->invalidate_current(iter TSRMLS_CC); } @@ -221,72 +213,60 @@ void IntlIterator_from_BreakIterator_parts(zval *break_iter_zv, { IntlIterator_object *ii; - zval_add_ref(&break_iter_zv); - object_init_ex(object, IntlPartsIterator_ce_ptr); - ii = (IntlIterator_object*)zend_object_store_get_object(object TSRMLS_CC); + ii = Z_INTL_ITERATOR_P(object); ii->iterator = (zend_object_iterator*)emalloc(sizeof(zoi_break_iter_parts)); - ii->iterator->data = break_iter_zv; + zend_iterator_init(ii->iterator TSRMLS_CC); + ZVAL_COPY(&ii->iterator->data, break_iter_zv); ii->iterator->funcs = &breakiterator_parts_it_funcs; ii->iterator->index = 0; ((zoi_with_current*)ii->iterator)->destroy_it = _breakiterator_parts_destroy_it; - ((zoi_with_current*)ii->iterator)->wrapping_obj = object; - ((zoi_with_current*)ii->iterator)->current = NULL; + ZVAL_COPY_VALUE(&((zoi_with_current*)ii->iterator)->wrapping_obj, object); + ZVAL_UNDEF(&((zoi_with_current*)ii->iterator)->current); - ((zoi_break_iter_parts*)ii->iterator)->bio = (BreakIterator_object*) - zend_object_store_get_object(break_iter_zv TSRMLS_CC); + ((zoi_break_iter_parts*)ii->iterator)->bio = Z_INTL_BREAKITERATOR_P(break_iter_zv); assert(((zoi_break_iter_parts*)ii->iterator)->bio->biter != NULL); ((zoi_break_iter_parts*)ii->iterator)->key_type = key_type; } -U_CFUNC zend_object_value IntlPartsIterator_object_create(zend_class_entry *ce TSRMLS_DC) +U_CFUNC zend_object *IntlPartsIterator_object_create(zend_class_entry *ce TSRMLS_DC) { - zend_object_value retval; - - retval = IntlIterator_ce_ptr->create_object(ce TSRMLS_CC); - retval.handlers = &IntlPartsIterator_handlers; + zend_object* retval = IntlIterator_ce_ptr->create_object(ce TSRMLS_CC); + retval->handlers = &IntlPartsIterator_handlers; return retval; } -U_CFUNC zend_function *IntlPartsIterator_get_method(zval **object_ptr, - char *method, int method_len, const zend_literal *key TSRMLS_DC) +U_CFUNC zend_function *IntlPartsIterator_get_method(zend_object **object_ptr, zend_string *method, const zval *key TSRMLS_DC) { - zend_literal local_literal = {0}; zend_function *ret; - ALLOCA_FLAG(use_heap) + zend_string *lc_method_name; + ALLOCA_FLAG(use_heap); if (key == NULL) { - Z_STRVAL(local_literal.constant) = static_cast<char*>( - do_alloca(method_len + 1, use_heap)); - zend_str_tolower_copy(Z_STRVAL(local_literal.constant), - method, method_len); - local_literal.hash_value = zend_hash_func( - Z_STRVAL(local_literal.constant), method_len + 1); - key = &local_literal; + STR_ALLOCA_ALLOC(lc_method_name, method->len, use_heap); + zend_str_tolower_copy(lc_method_name->val, method->val, method->len); + } else { + lc_method_name = Z_STR_P(key); } - if ((key->hash_value & 0xFFFFFFFF) == 0xA2B486A1 /* hash of getrulestatus\0 */ - && method_len == sizeof("getrulestatus") - 1 - && memcmp("getrulestatus", Z_STRVAL(key->constant), method_len) == 0) { - IntlIterator_object *obj = (IntlIterator_object*) - zend_object_store_get_object(*object_ptr TSRMLS_CC); - if (obj->iterator && obj->iterator->data) { - zval *break_iter_zv = static_cast<zval*>(obj->iterator->data); - *object_ptr = break_iter_zv; - ret = Z_OBJ_HANDLER_P(break_iter_zv, get_method)(object_ptr, - method, method_len, key TSRMLS_CC); + if (method->len == sizeof("getrulestatus") - 1 + && memcmp("getrulestatus", Z_STRVAL_P(key), method->len) == 0) { + IntlIterator_object *obj = php_intl_iterator_fetch_object(*object_ptr); + if (obj->iterator && !Z_ISUNDEF(obj->iterator->data)) { + zval *break_iter_zv = &obj->iterator->data; + *object_ptr = Z_OBJ_P(break_iter_zv); + ret = Z_OBJ_HANDLER_P(break_iter_zv, get_method)(object_ptr, method, key TSRMLS_CC); goto end; } } - ret = std_object_handlers.get_method(object_ptr, - method, method_len, key TSRMLS_CC); + ret = std_object_handlers.get_method(object_ptr, method, key TSRMLS_CC); end: - if (key == &local_literal) { - free_alloca(Z_STRVAL(local_literal.constant), use_heap); + if (key == NULL) { + STR_ALLOCA_FREE(lc_method_name, use_heap); } return ret; @@ -304,7 +284,7 @@ U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator) INTLITERATOR_METHOD_FETCH_OBJECT; - zval *biter_zval = static_cast<zval*>(ii->iterator->data); + zval *biter_zval = &ii->iterator->data; RETURN_ZVAL(biter_zval, 1, 0); } |