From: Xinchen Hui Date: Sat, 28 Jun 2014 04:20:35 +0000 (+0800) Subject: Refactoring ext/intl (only compilerable now, far to finish :<) X-Git-Tag: POST_PHPNG_MERGE~124 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b6e9c76d67a8cfb397598ac354d9aeb9609ba1d2;p=php Refactoring ext/intl (only compilerable now, far to finish :<) --- diff --git a/ext/intl/breakiterator/breakiterator_class.cpp b/ext/intl/breakiterator/breakiterator_class.cpp index e756f366ef..73d4b7550f 100644 --- a/ext/intl/breakiterator/breakiterator_class.cpp +++ b/ext/intl/breakiterator/breakiterator_class.cpp @@ -135,7 +135,7 @@ static zend_object *BreakIterator_clone_obj(zval *object TSRMLS_DC) /* {{{ get_debug_info handler for BreakIterator */ static HashTable *BreakIterator_get_debug_info(zval *object, int *is_temp TSRMLS_DC) { - zval zv = zval_used_for_init; + zval zv; BreakIterator_object *bio; const BreakIterator *biter; 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(emalloc(sizeof *zoi_iter)); - zoi_iter->zoi.data = static_cast(object); + zoi_with_current *zoi_iter = static_cast(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(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(&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(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( - 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(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(ii->iterator->data); + zval *biter_zval = &ii->iterator->data; RETURN_ZVAL(biter_zval, 1, 0); } diff --git a/ext/intl/breakiterator/breakiterator_methods.cpp b/ext/intl/breakiterator/breakiterator_methods.cpp index 1a1b4fd127..712c58fbbd 100644 --- a/ext/intl/breakiterator/breakiterator_methods.cpp +++ b/ext/intl/breakiterator/breakiterator_methods.cpp @@ -139,10 +139,10 @@ U_CFUNC PHP_FUNCTION(breakiter_get_text) BREAKITER_METHOD_FETCH_OBJECT; - if (bio->text == NULL) { + if (Z_ISUNDEF(bio->text)) { RETURN_NULL(); } else { - RETURN_ZVAL(bio->text, 1, 0); + ZVAL_COPY(return_value, &bio->text); } } @@ -151,7 +151,7 @@ U_CFUNC PHP_FUNCTION(breakiter_set_text) char *text; int text_len; UText *ut = NULL; - zval **textzv; + zval *textzv; BREAKITER_METHOD_INIT_VARS; object = getThis(); @@ -169,7 +169,7 @@ U_CFUNC PHP_FUNCTION(breakiter_set_text) /* assert it's safe to use text and text_len because zpp changes the * arguments in the stack */ - assert(text == Z_STRVAL_PP(textzv)); + assert(text == Z_STRVAL_P(textzv)); ut = utext_openUTF8(ut, text, text_len, BREAKITER_ERROR_CODE_P(bio)); INTL_CTOR_CHECK_STATUS(bio, "breakiter_set_text: error opening UText"); @@ -182,11 +182,8 @@ U_CFUNC PHP_FUNCTION(breakiter_set_text) /* When ICU clones the UText, it does not copy the buffer, so we have to * keep the string buffer around by holding a reference to its zval. This * also allows a faste implementation of getText() */ - if (bio->text != NULL) { - zval_ptr_dtor(&bio->text); - } - bio->text = *textzv; - zval_add_ref(&bio->text); + zval_ptr_dtor(&bio->text); + ZVAL_COPY(&bio->text, textzv); RETURN_TRUE; } @@ -274,12 +271,12 @@ U_CFUNC PHP_FUNCTION(breakiter_next) if (ZEND_NUM_ARGS() == 0) { no_arg_version = true; } else if (ZEND_NUM_ARGS() == 1) { - zval **arg; + zval *arg; int res = zend_get_parameters_ex(1, &arg); assert(res == SUCCESS); - if (Z_TYPE_PP(arg) == IS_NULL) { + if (Z_TYPE_P(arg) == IS_NULL) { no_arg_version = true; - ht = 0; /* pretend we don't have any argument */ + ZEND_NUM_ARGS() = 0; /* pretend we don't have any argument */ } else { no_arg_version = false; } @@ -380,7 +377,7 @@ U_CFUNC PHP_FUNCTION(breakiter_get_locale) INTL_METHOD_CHECK_STATUS(bio, "breakiter_get_locale: Call to ICU method has failed"); - RETURN_STRING(locale.getName(), 1); + RETURN_STRING(locale.getName()); } U_CFUNC PHP_FUNCTION(breakiter_get_parts_iterator) @@ -421,7 +418,7 @@ U_CFUNC PHP_FUNCTION(breakiter_get_error_code) } /* Fetch the object (without resetting its last error code ). */ - bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC); + bio = Z_INTL_BREAKITERATOR_P(object); if (bio == NULL) RETURN_FALSE; @@ -430,7 +427,7 @@ U_CFUNC PHP_FUNCTION(breakiter_get_error_code) U_CFUNC PHP_FUNCTION(breakiter_get_error_message) { - const char* message = NULL; + zend_string* message = NULL; BREAKITER_METHOD_INIT_VARS; object = getThis(); @@ -442,11 +439,11 @@ U_CFUNC PHP_FUNCTION(breakiter_get_error_message) /* Fetch the object (without resetting its last error code ). */ - bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC); + bio = Z_INTL_BREAKITERATOR_P(object); if (bio == NULL) RETURN_FALSE; /* Return last error message. */ message = intl_error_get_message(BREAKITER_ERROR_P(bio) TSRMLS_CC); - RETURN_STRING(message, 0); + RETURN_STR(message); } diff --git a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp index 454e5249fd..0871f4416f 100644 --- a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp +++ b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp @@ -66,7 +66,7 @@ static void _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAMETERS) smart_str parse_error_str; parse_error_str = intl_parse_error_to_string(&parseError); spprintf(&msg, 0, "rbbi_create_instance: unable to create " - "RuleBasedBreakIterator from rules (%s)", parse_error_str.c); + "RuleBasedBreakIterator from rules (%s)", parse_error_str.s? parse_error_str.s->val : ""); smart_str_free(&parse_error_str); intl_error_set_custom_msg(NULL, msg, 1 TSRMLS_CC); efree(msg); @@ -101,7 +101,7 @@ U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, __construct) _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAM_PASSTHRU); if (Z_TYPE_P(return_value) == IS_NULL) { - zend_object_store_ctor_failed(&orig_this TSRMLS_CC); + zend_object_store_ctor_failed(Z_OBJ(orig_this) TSRMLS_CC); zval_dtor(&orig_this); } } @@ -119,17 +119,20 @@ U_CFUNC PHP_FUNCTION(rbbi_get_rules) BREAKITER_METHOD_FETCH_OBJECT; + char *str; + int str_len; const UnicodeString rules = fetch_rbbi(bio)->getRules(); - Z_TYPE_P(return_value) = IS_STRING; - if (intl_charFromString(rules, &Z_STRVAL_P(return_value), - &Z_STRLEN_P(return_value), BREAKITER_ERROR_CODE_P(bio)) == FAILURE) + if (intl_charFromString(rules, &str, &str_len, BREAKITER_ERROR_CODE_P(bio)) == FAILURE) { intl_errors_set(BREAKITER_ERROR_P(bio), BREAKITER_ERROR_CODE(bio), "rbbi_hash_code: Error converting result to UTF-8 string", 0 TSRMLS_CC); RETURN_FALSE; } + RETVAL_STRINGL(str, str_len); + //??? + efree(str); } U_CFUNC PHP_FUNCTION(rbbi_get_rule_status) diff --git a/ext/intl/calendar/calendar_class.cpp b/ext/intl/calendar/calendar_class.cpp index 151fc2508e..71de7f7098 100644 --- a/ext/intl/calendar/calendar_class.cpp +++ b/ext/intl/calendar/calendar_class.cpp @@ -146,7 +146,7 @@ static const struct { /* {{{ get_debug_info handler for Calendar */ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC) { - zval zv = zval_used_for_init, + zval zv, zfields; Calendar_object *co; const Calendar *cal; @@ -169,7 +169,7 @@ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC) const_cast(cal->getType())); { - zval ztz = zval_used_for_init, + zval ztz, ztz_debug; int is_tmp; HashTable *debug_info; diff --git a/ext/intl/calendar/calendar_methods.cpp b/ext/intl/calendar/calendar_methods.cpp index ad2a0b499e..54fe15a8b7 100644 --- a/ext/intl/calendar/calendar_methods.cpp +++ b/ext/intl/calendar/calendar_methods.cpp @@ -1248,7 +1248,7 @@ U_CFUNC PHP_FUNCTION(intlcal_to_date_time) int64_t ts; char ts_str[sizeof("@-9223372036854775808")]; int ts_str_len; - zval ts_tmp, ts_zval = zval_used_for_init; + zval ts_tmp, ts_zval; INTL_METHOD_CHECK_STATUS(co, "Call to ICU method has failed"); diff --git a/ext/intl/collator/collator_class.c b/ext/intl/collator/collator_class.c index 8e1255c023..25a3ac8909 100644 --- a/ext/intl/collator/collator_class.c +++ b/ext/intl/collator/collator_class.c @@ -45,7 +45,7 @@ static void Collator_objects_dtor(zend_object *object TSRMLS_DC ) /* {{{ Collator_objects_free */ void Collator_objects_free(zend_object *object TSRMLS_DC ) { - Collator_object* co = php_collator_fetch_object(object); + Collator_object* co = php_intl_collator_fetch_object(object); zend_object_std_dtor(&co->zo TSRMLS_CC ); diff --git a/ext/intl/collator/collator_class.h b/ext/intl/collator/collator_class.h index 75a3cab8fa..8410e96646 100644 --- a/ext/intl/collator/collator_class.h +++ b/ext/intl/collator/collator_class.h @@ -61,7 +61,7 @@ extern zend_class_entry *Collator_ce_ptr; Collator_object* co = NULL; \ intl_error_reset( NULL TSRMLS_CC ); \ -#define COLLATOR_METHOD_FETCH_OBJECT INTL_METHOD_FETCH_OBJECT(INIL_COLLATOR, co) +#define COLLATOR_METHOD_FETCH_OBJECT INTL_METHOD_FETCH_OBJECT(INTL_COLLATOR, co) // Macro to check return value of a ucol_* function call. #define COLLATOR_CHECK_STATUS( co, msg ) \ diff --git a/ext/intl/collator/collator_error.c b/ext/intl/collator/collator_error.c index 2be25d1c5d..91bc25d077 100644 --- a/ext/intl/collator/collator_error.c +++ b/ext/intl/collator/collator_error.c @@ -59,7 +59,7 @@ PHP_FUNCTION( collator_get_error_code ) */ PHP_FUNCTION( collator_get_error_message ) { - const char* message = NULL; + zend_string* message = NULL; COLLATOR_METHOD_INIT_VARS @@ -80,9 +80,7 @@ PHP_FUNCTION( collator_get_error_message ) /* Return last error message. */ message = intl_error_get_message( COLLATOR_ERROR_P( co ) TSRMLS_CC ); - RETVAL_STRING( (char*)message); - //??? - efree((char *)message); + RETURN_STR(message); } /* }}} */ diff --git a/ext/intl/formatter/formatter_class.c b/ext/intl/formatter/formatter_class.c index cc4631cc3a..601aeae5e6 100644 --- a/ext/intl/formatter/formatter_class.c +++ b/ext/intl/formatter/formatter_class.c @@ -73,9 +73,11 @@ zend_object *NumberFormatter_object_create(zend_class_entry *ce TSRMLS_DC) zend_object *NumberFormatter_object_clone(zval *object TSRMLS_DC) { NumberFormatter_object *nfo, *new_nfo; + zend_object *new_obj; FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK; - new_nfo = NumberFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC); + new_obj = NumberFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC); + new_nfo = php_intl_number_format_fetch_object(new_obj); /* clone standard parts */ zend_objects_clone_members(&new_nfo->zo, &nfo->zo TSRMLS_CC); /* clone formatter object. It may fail, the destruction code must handle this case */ @@ -91,7 +93,7 @@ zend_object *NumberFormatter_object_clone(zval *object TSRMLS_DC) } else { zend_throw_exception(NULL, "Cannot clone unconstructed NumberFormatter", 0 TSRMLS_CC); } - return new_nfo; + return new_obj; } /* }}} */ diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c index 3089a6fec7..e266d60808 100644 --- a/ext/intl/formatter/formatter_main.c +++ b/ext/intl/formatter/formatter_main.c @@ -111,7 +111,7 @@ PHP_FUNCTION( numfmt_get_error_code ) RETURN_FALSE; } - nfo = Z_INTL_NUMERFORMATTER_P(object); + nfo = Z_INTL_NUMBERFORMATTER_P(object); /* Return formatter's last error code. */ RETURN_LONG( INTL_DATA_ERROR_CODE(nfo) ); @@ -138,7 +138,7 @@ PHP_FUNCTION( numfmt_get_error_message ) RETURN_FALSE; } - nfo = Z_INTL_NUMERFORMATTER_P(object); + nfo = Z_INTL_NUMBERFORMATTER_P(object); /* Return last error message. */ message = intl_error_get_message( INTL_DATA_ERROR_P(nfo) TSRMLS_CC ); diff --git a/ext/intl/grapheme/grapheme_string.c b/ext/intl/grapheme/grapheme_string.c index f4172636e5..eeb44d83c8 100644 --- a/ext/intl/grapheme/grapheme_string.c +++ b/ext/intl/grapheme/grapheme_string.c @@ -835,13 +835,14 @@ PHP_FUNCTION(grapheme_extract) } if ( NULL != next ) { - if ( !PZVAL_IS_REF(next) ) { + if ( !Z_ISREF_P(next) ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_extract: 'next' was not passed by reference", 0 TSRMLS_CC ); RETURN_FALSE; } else { + ZVAL_DEREF(next); /* initialize next */ zval_dtor(next); ZVAL_LONG(next, lstart); diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index 6332488cc9..f59fea494b 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -256,7 +256,9 @@ static void php_intl_idn_to(INTERNAL_FUNCTION_PARAMETERS, } /* return the allocated string, not a duplicate */ - RETURN_STRINGL(((char *)converted_utf8), converted_utf8_len, 0); + RETVAL_STRINGL(((char *)converted_utf8), converted_utf8_len); + //???? + efree(converted_utf8); } static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp index 10e3fc3770..ea1ea729a3 100644 --- a/ext/intl/msgformat/msgformat_helpers.cpp +++ b/ext/intl/msgformat/msgformat_helpers.cpp @@ -343,10 +343,9 @@ static void umsg_set_timezone(MessageFormatter_object *mfo, } if (used_tz == NULL) { - zval nullzv = zval_used_for_init, - *zvptr = &nullzv; - used_tz = timezone_process_timezone_argument(zvptr, &err, - "msgfmt_format" TSRMLS_CC); + zval nullzv, *zvptr = &nullzv; + ZVAL_UNDEF(zvptr); + used_tz = timezone_process_timezone_argument(zvptr, &err, "msgfmt_format" TSRMLS_CC); if (used_tz == NULL) { continue; } diff --git a/ext/intl/msgformat/msgformat_parse.c b/ext/intl/msgformat/msgformat_parse.c index 14a6363424..3ae9a49b46 100644 --- a/ext/intl/msgformat/msgformat_parse.c +++ b/ext/intl/msgformat/msgformat_parse.c @@ -30,7 +30,7 @@ /* {{{ */ static void msgfmt_do_parse(MessageFormatter_object *mfo, char *source, int src_len, zval *return_value TSRMLS_DC) { - zval **fargs; + zval *fargs; int count = 0; int i; UChar *usource = NULL; @@ -47,7 +47,7 @@ static void msgfmt_do_parse(MessageFormatter_object *mfo, char *source, int src_ array_init(return_value); for(i=0;ime = source->child; source->child = NULL; intl_errors_reset(INTL_DATA_ERROR_P(source) TSRMLS_CC); diff --git a/ext/intl/resourcebundle/resourcebundle_class.c b/ext/intl/resourcebundle/resourcebundle_class.c index d988d85e8f..0def78ea9e 100644 --- a/ext/intl/resourcebundle/resourcebundle_class.c +++ b/ext/intl/resourcebundle/resourcebundle_class.c @@ -210,18 +210,14 @@ static void resourcebundle_array_fetch(zval *object, zval *offset, zval *return_ /* }}} */ /* {{{ resourcebundle_array_get */ -zval *resourcebundle_array_get(zval *object, zval *offset, int type TSRMLS_DC) +zval *resourcebundle_array_get(zval *object, zval *offset, int type, zval *rv TSRMLS_DC) { - zval *retval; - if(offset == NULL) { php_error( E_ERROR, "Cannot apply [] to ResourceBundle object" ); } - MAKE_STD_ZVAL(retval); - - resourcebundle_array_fetch(object, offset, retval, 1 TSRMLS_CC); - Z_DELREF_P(retval); - return retval; + ZVAL_NULL(rv); + resourcebundle_array_fetch(object, offset, rv, 1 TSRMLS_CC); + return rv; } /* }}} */ diff --git a/ext/intl/spoofchecker/spoofchecker_class.c b/ext/intl/spoofchecker/spoofchecker_class.c index 6c2b79034d..7ae1a2feb6 100644 --- a/ext/intl/spoofchecker/spoofchecker_class.c +++ b/ext/intl/spoofchecker/spoofchecker_class.c @@ -30,48 +30,37 @@ static zend_object_handlers Spoofchecker_handlers; */ /* {{{ Spoofchecker_objects_dtor */ -static void Spoofchecker_objects_dtor( - void *object, - zend_object_handle handle TSRMLS_DC) +static void Spoofchecker_objects_dtor(zend_object *object TSRMLS_DC) { - zend_objects_destroy_object(object, handle TSRMLS_CC); + zend_objects_destroy_object(object TSRMLS_CC); } /* }}} */ /* {{{ Spoofchecker_objects_free */ void Spoofchecker_objects_free(zend_object *object TSRMLS_DC) { - Spoofchecker_object* co = (Spoofchecker_object*)object; + Spoofchecker_object* co = php_intl_spoofchecker_fetch_object(object); zend_object_std_dtor(&co->zo TSRMLS_CC); spoofchecker_object_destroy(co TSRMLS_CC); - - efree(co); } /* }}} */ /* {{{ Spoofchecker_object_create */ -zend_object_value Spoofchecker_object_create( +zend_object *Spoofchecker_object_create( zend_class_entry *ce TSRMLS_DC) { - zend_object_value retval; Spoofchecker_object* intern; - intern = ecalloc(1, sizeof(Spoofchecker_object)); + intern = ecalloc(1, sizeof(Spoofchecker_object) + sizeof(zval) * (ce->default_properties_count - 1)); intl_error_init(SPOOFCHECKER_ERROR_P(intern) TSRMLS_CC); zend_object_std_init(&intern->zo, ce TSRMLS_CC); object_properties_init(&intern->zo, ce); - retval.handle = zend_objects_store_put( - intern, - Spoofchecker_objects_dtor, - (zend_objects_free_object_storage_t)Spoofchecker_objects_free, - NULL TSRMLS_CC); - - retval.handlers = &Spoofchecker_handlers; + intern->zo.handlers = &Spoofchecker_handlers; - return retval; + return &intern->zo; } /* }}} */ @@ -118,25 +107,24 @@ zend_function_entry Spoofchecker_class_functions[] = { }; /* }}} */ -static zend_object_value spoofchecker_clone_obj(zval *object TSRMLS_DC) /* {{{ */ +static zend_object *spoofchecker_clone_obj(zval *object TSRMLS_DC) /* {{{ */ { - zend_object_value new_obj_val; - zend_object_handle handle = Z_OBJ_HANDLE_P(object); + zend_object *new_obj_val; Spoofchecker_object *sfo, *new_sfo; - sfo = (Spoofchecker_object *) zend_object_store_get_object(object TSRMLS_CC); + sfo = Z_INTL_SPOOFCHECKER_P(object); intl_error_reset(SPOOFCHECKER_ERROR_P(sfo) TSRMLS_CC); new_obj_val = Spoofchecker_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC); - new_sfo = (Spoofchecker_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC); + new_sfo = php_intl_spoofchecker_fetch_object(new_obj_val); /* clone standard parts */ - zend_objects_clone_members(&new_sfo->zo, new_obj_val, &sfo->zo, handle TSRMLS_CC); + zend_objects_clone_members(&new_sfo->zo, &sfo->zo TSRMLS_CC); /* clone internal object */ new_sfo->uspoof = uspoof_clone(sfo->uspoof, SPOOFCHECKER_ERROR_CODE_P(new_sfo)); if(U_FAILURE(SPOOFCHECKER_ERROR_CODE(new_sfo))) { /* set up error in case error handler is interested */ intl_error_set( NULL, SPOOFCHECKER_ERROR_CODE(new_sfo), "Failed to clone SpoofChecker object", 0 TSRMLS_CC ); - Spoofchecker_objects_dtor(new_sfo, new_obj_val.handle TSRMLS_CC); /* free new object */ + Spoofchecker_objects_dtor(&new_sfo->zo TSRMLS_CC); /* free new object */ zend_error(E_ERROR, "Failed to clone SpoofChecker object"); } return new_obj_val; @@ -157,7 +145,10 @@ void spoofchecker_register_Spoofchecker_class(TSRMLS_D) memcpy(&Spoofchecker_handlers, zend_get_std_object_handlers(), sizeof Spoofchecker_handlers); + Spoofchecker_handlers.offset = XtOffsetOf(Spoofchecker_object, zo); Spoofchecker_handlers.clone_obj = spoofchecker_clone_obj; + Spoofchecker_handlers.dtor_obj = Spoofchecker_objects_dtor; + Spoofchecker_handlers.free_obj = Spoofchecker_objects_free; if (!Spoofchecker_ce_ptr) { zend_error(E_ERROR, diff --git a/ext/intl/spoofchecker/spoofchecker_class.h b/ext/intl/spoofchecker/spoofchecker_class.h index ec043d9dc8..9683b03b08 100644 --- a/ext/intl/spoofchecker/spoofchecker_class.h +++ b/ext/intl/spoofchecker/spoofchecker_class.h @@ -27,15 +27,20 @@ #include typedef struct { - zend_object zo; - // error handling intl_error err; // ICU Spoofchecker USpoofChecker* uspoof; + + zend_object zo; } Spoofchecker_object; +static inline Spoofchecker_object *php_intl_spoofchecker_fetch_object(zend_object *obj) { + return (Spoofchecker_object *)((char*)(obj) - XtOffsetOf(Spoofchecker_object, zo)); +} +#define Z_INTL_SPOOFCHECKER_P(zv) php_intl_spoofchecker_fetch_object((Z_OBJ_P(zv))) + #define SPOOFCHECKER_ERROR(co) (co)->err #define SPOOFCHECKER_ERROR_P(co) &(SPOOFCHECKER_ERROR(co)) @@ -56,7 +61,7 @@ extern zend_class_entry *Spoofchecker_ce_ptr; Spoofchecker_object* co = NULL; \ intl_error_reset(NULL TSRMLS_CC); \ -#define SPOOFCHECKER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(Spoofchecker, co) +#define SPOOFCHECKER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_SPOOFCHECKER, co) #define SPOOFCHECKER_METHOD_FETCH_OBJECT \ SPOOFCHECKER_METHOD_FETCH_OBJECT_NO_CHECK; \ if (co->uspoof == NULL) { \ diff --git a/ext/intl/timezone/timezone_class.cpp b/ext/intl/timezone/timezone_class.cpp index 40d1c99289..a1996d9293 100644 --- a/ext/intl/timezone/timezone_class.cpp +++ b/ext/intl/timezone/timezone_class.cpp @@ -65,7 +65,7 @@ U_CFUNC zval *timezone_convert_to_datetimezone(const TimeZone *timeZone, UnicodeString id; char *message = NULL; php_timezone_obj *tzobj; - zval arg = zval_used_for_init; + zval arg; timeZone->getID(id); if (id.isBogus()) { @@ -132,7 +132,7 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval *zv_timezone, intl_error *outside_error, const char *func TSRMLS_DC) { - zval local_zv_tz = zval_used_for_init; + zval local_zv_tz; char *message = NULL; TimeZone *timeZone; @@ -287,7 +287,7 @@ static int TimeZone_compare_objects(zval *object1, zval *object2 TSRMLS_DC) /* {{{ get_debug_info handler for TimeZone */ static HashTable *TimeZone_get_debug_info(zval *object, int *is_temp TSRMLS_DC) { - zval zv = zval_used_for_init; + zval zv; TimeZone_object *to; const TimeZone *tz; UnicodeString ustr;