]> granicus.if.org Git - php/commitdiff
Refactoring ext/intl (only compilerable now, far to finish :<)
authorXinchen Hui <laruence@php.net>
Sat, 28 Jun 2014 04:20:35 +0000 (12:20 +0800)
committerXinchen Hui <laruence@php.net>
Sat, 28 Jun 2014 04:20:35 +0000 (12:20 +0800)
21 files changed:
ext/intl/breakiterator/breakiterator_class.cpp
ext/intl/breakiterator/breakiterator_iterators.cpp
ext/intl/breakiterator/breakiterator_methods.cpp
ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp
ext/intl/calendar/calendar_class.cpp
ext/intl/calendar/calendar_methods.cpp
ext/intl/collator/collator_class.c
ext/intl/collator/collator_class.h
ext/intl/collator/collator_error.c
ext/intl/formatter/formatter_class.c
ext/intl/formatter/formatter_main.c
ext/intl/grapheme/grapheme_string.c
ext/intl/idn/idn.c
ext/intl/msgformat/msgformat_helpers.cpp
ext/intl/msgformat/msgformat_parse.c
ext/intl/php_intl.c
ext/intl/resourcebundle/resourcebundle.c
ext/intl/resourcebundle/resourcebundle_class.c
ext/intl/spoofchecker/spoofchecker_class.c
ext/intl/spoofchecker/spoofchecker_class.h
ext/intl/timezone/timezone_class.cpp

index e756f366ef64df9172202fd4463480647b4bbb36..73d4b7550fb5e4b28d006e101a741ce74d9dcd0b 100644 (file)
@@ -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;
 
index 55112c1f5add760dba8cba741a4586ff845e4bcb..a5b783484709fb49da237430b01e7ba55d0bf698 100644 (file)
@@ -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);
 }
 
index 1a1b4fd1274c30c17d58603fb7ed0c63b740e53e..712c58fbbdc808e8fb3c55ae1f3ce013c7c0100f 100644 (file)
@@ -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);
 }
index 454e5249fde9628fc6cc39100cd7af76a0579b4a..0871f4416f12017a47e8615f4e1a174e85b1c0a4 100644 (file)
@@ -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)
index 151fc2508edaf9bf53f23b34247110538c9348ce..71de7f709803965d8ba2980454968c27788416b9 100644 (file)
@@ -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<char*>(cal->getType()));
 
        {
-               zval               ztz = zval_used_for_init,
+               zval               ztz,
                                           ztz_debug;
                int                        is_tmp;
                HashTable          *debug_info;
index ad2a0b499e475ce59a5d101dca4242aae0cdeba0..54fe15a8b715f52bf92e52fc3a5ec4d91d4a043c 100644 (file)
@@ -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");
 
index 8e1255c0233664223262dd0520370ef1e870f983..25a3ac890940b328db81f2c04fbed0b3e1b35d82 100644 (file)
@@ -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 );
 
index 75a3cab8fa010bfdb73fcc32432a70960c23920a..8410e96646a4ad02587baea7bf790facdc12c451 100644 (file)
@@ -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 )                                        \
index 2be25d1c5db6c538a3dbd6d03eba06816d264747..91bc25d07771833ff1e3492cb57db84ad27fd842 100644 (file)
@@ -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);
 }
 /* }}} */
 
index cc4631cc3a867aaa9bca4e5ab97f0dd8c3e1be39..601aeae5e61ca74e89a6670ac741aebe502570be 100644 (file)
@@ -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;
 }
 /* }}} */
 
index 3089a6fec754becaaa77b24bb76e6e1553d6520b..e266d6080826f3cb65f5ec9ab377dbebb2591003 100644 (file)
@@ -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 );
index f4172636e521a751f7cb928bffeed8cac1c5f12e..eeb44d83c81f510ce955002426398fbf957eb84c 100644 (file)
@@ -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);
index 6332488cc9c3d5347fb0e5405d581e98e9d3cd96..f59fea494ba41e4e085f52ec4ec39ef23e523f73 100644 (file)
@@ -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)
index 10e3fc3770abb57973ac8b820a9bb994d6ab3421..ea1ea729a32c1c27bee296d626ed5753882a485e 100644 (file)
@@ -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;
                        }
index 14a6363424bf099d565f79d5f1430b733c9938d8..3ae9a49b4670b232e3450472c2eea7da60089843 100644 (file)
@@ -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;i<count;i++) {
-               add_next_index_zval(return_value, fargs[i]);
+               add_next_index_zval(return_value, &fargs[i]);
        }
        efree(fargs);
 }
index 65e53c8b5e8248dc111d7934d5652c8f7573132f..5b8a730c49a49d51e3fcd6aa4bfd4bc964e53b51 100644 (file)
@@ -1032,8 +1032,8 @@ PHP_RINIT_FUNCTION( intl )
  */
 PHP_RSHUTDOWN_FUNCTION( intl )
 {
-       if(INTL_G(current_collator)) {
-               INTL_G(current_collator) = NULL;
+       if(!Z_ISUNDEF(INTL_G(current_collator))) {
+               ZVAL_UNDEF(&INTL_G(current_collator));
        }
        if (INTL_G(grapheme_iterator)) {
                grapheme_close_global_iterator( TSRMLS_C );
index 658f02a6af3bb06233c69f0893f367f79a98b348..66978eb8885a8c2a33913fcad86e9fe6bf2f82f5 100644 (file)
@@ -68,7 +68,7 @@ void resourcebundle_extract_value( zval *return_value, ResourceBundle_object *so
                case URES_ARRAY:
                case URES_TABLE:
                        object_init_ex( return_value, ResourceBundle_ce_ptr );
-                       newrb = (ResourceBundle_object *) zend_object_store_get_object( return_value TSRMLS_CC );
+                       newrb = Z_INTL_RESOURCEBUNDLE_P(return_value);
                        newrb->me = source->child;
                        source->child = NULL;
                        intl_errors_reset(INTL_DATA_ERROR_P(source) TSRMLS_CC);
index d988d85e8f35035c48481178820aa5fe0909f562..0def78ea9e33f882379a31e9e9061d74e0ac3533 100644 (file)
@@ -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;
 }
 /* }}} */
 
index 6c2b79034df7332fe9ea146bee197194942f9860..7ae1a2feb653dbdb151746f9b62e04d79641e80f 100644 (file)
@@ -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,
index ec043d9dc8776aac09a1f07036c7c5e783b2f91c..9683b03b08dab206fe629d6a11e1fcf9e183005b 100644 (file)
 #include <unicode/uspoof.h>
 
 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) {                                                                               \
index 40d1c9928977fa05ede874eac6ebe0cda7463b5c..a1996d9293f2c5ea8908962cfae52b4f23c39b70 100644 (file)
@@ -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;